AppDomain卸载后程序集没有卸载?

时间:2012-11-18 12:21:17

标签: .net appdomain .net-assembly

我正在使用AppDomain来加载程序集然后卸载它们。

然而,我有一个非常严重的问题。在卸载AppDomain之后 - 我仍然可以在进程资源管理器中看到一些程序集被多次加载! 为什么有装载组件的剩余部分? AppDomain.Unload不会释放所有AppDomain加载的内存吗?

您可以在附件中看到:

总AppDomains为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 ......

enter image description here

1 个答案:

答案 0 :(得分:2)

您加载到外部应用程序域的程序集很可能会被放入当前程序集中。有可能会发生这种情况,但您的问题尤其是将Assembly.GetExecutingAssembly().CodeBase传递给CreateInstanceFromAndUnwrap方法。对Assembly.GetExecutingAssembly()的调用会将当前正在执行的程序集加载到当前应用程序域中,并将.CodeBase属性传递给 在实例化目标代理之前,CreateInstanceFromAndUnwrap将尝试将目标程序集(位于应用程序路径或GAC中)加载到目标域中。目前,除了可能的出血问题之外,我认为此代码没有任何问题。

如果您有多个应用程序域,那么您将在LoadFrom上下文中看到程序集的多个副本,因为在AppDomains之间共享的程序集是mscorlib.dll。除非我误解了你的问题,否则我认为你所看到的是正常的。