نمیشه گفت مشکل، DLL اصولا برای استفاده اشتراکی طراحی شد، یعنی چند برنامه بتوانند همزمان ازش استفاده کنند، به همین جهت سیستم در آزاد کردن حافظه اش عجله نمی کنه.
روال اینطوریه که وقتی اولین برنامه درخواست دسترسی به کتابخانه رو داد سیستم عامل کتابخانه رو Load می کنه و در حافظه سیستم برایش فضا در نظر می گیره
مادامی که برنامه ای در حال اجرا است که درخواست فراخوانی این کتابخانه رو داره از داخل حافظه آزاد اش نمی کنه.
زمانی که آخرین برنامه متقاضی هم بسته شد باز یه مدت زمانی که به مدیریت حافظه سیستم بستگی داره همچنان DLL رو در حافظه نگه میداره، مگر اینکه از لحاظ حافظه آزاد خیلی در مضیقه باشه.
دو تا کار می توانید انجام بدید.
اولا ویندوز یه تنظیمی داره که اگه تغییر اش بدید در اون ویندوز DLL ها به محض تموم شدن کارشون از حافظه در میان و باقی نمی مونند.
در مسیر HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer در Registry ویندوز اگه یه متغیر String با نام AlwaysUnloadDLL قرار بگیره که مقدار 1 داخلش ذخیره بشه، دیگه سیستم DLL رو در حافظه بلا استفاده نگه نمیداره. برای تاثیر گذاشتن این تنظیم یکبار Restart کردن سیستم لازمه.
ثانیا می توانید از API ویندوز CoFreeUnusedLibrariesEx رو که در Ole32.dll قرار داره فراخوانی کنید تا تمامی DLL های بلا استفاده آزاد بشن.
MSDN - CoFreeUnusedLibrariesEx function