【发布时间】:2012-11-06 13:29:21
【问题描述】:
我正在使用 AppDomain 来加载程序集然后卸载它们。
但是,我遇到了一个非常严重的问题。卸载 AppDomain 后 - 我仍然可以在进程资源管理器中看到某些程序集被多次加载! 为什么有剩余的加载程序集? AppDomain.Unload 不会释放所有 AppDomain 加载的内存吗?
您可以在附图中看到:
AppDomain 总数为 3(我在进程的生命周期中创建了 3 个 AppDomain)
AppDomains: 1(目前仅存在 1 个 AppDomain)
由于某种原因,正如您在下面加载的 DLL 部分中看到的那样 - 程序集被多次加载到进程中..
代码:
AppDomain fetcherDomain = AppDomain.CreateDomain("StatusFetcher");
try
{
var fetcher = (LocalStatusFetcher)fetcherDomain.CreateInstanceFromAndUnwrap(Assembly.GetExecutingAssembly().CodeBase, typeof(LocalStatusFetcher).FullName);
//doing some other stuff that is not interesting...
}
finally
{
AppDomain.Unload(fetcherDomain);
}
是的,LocalStatusFetcher 确实继承了 MarshalByRefObject...
【问题讨论】:
-
也许你也在你的主 AppDomain 中加载程序集。顺便说一句,图像分辨率太低,我什么都看不到。
-
我想到了,但事实并非如此(使用调试器检查) - 此外,程序集仅在加载到多个 AppDomain 时才会出现多次。关于图片质量-它是stackoverflow,如果您将图片的网址粘贴到另一个标签中,您将能够看到它。
-
从屏幕截图中可见的程序集都是 .NET Framework 程序集。您的程序集也会发生这种情况吗?
-
是的。根据我的观察,在创建新 AppDomain 之前加载的所有程序集都会发生这种情况。例如如果在创建新 AppDomain 之前未加载程序集 - 它将在新 AppDomain 卸载时正确释放。
-
您能否发布创建 AppDomain 并加载程序集的代码?
标签: .net appdomain .net-assembly