我使用AppDomain来加载程序集,然后卸载它们。
然而,我遇到了一个非常困难的问题。在卸载AppDomain之后--我仍然可以在process中看到一些程序集被多次加载!为什么装载的组件还有剩余的部分?AppDomain.Unload不释放所有AppDomain加载的内存吗?
您可以在所附图像中看到:
总AppDomains为3(我在进程的生命周期中创建了3 AppDomains )
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..。

发布于 2012-11-26 01:50:22
您要加载到外部应用程序域中的程序集很有可能被流到当前应用程序域中。这种情况有很多种可能发生的方式,但您的问题尤其是如何将Assembly.GetExecutingAssembly().CodeBase传递给CreateInstanceFromAndUnwrap方法。对Assembly.GetExecutingAssembly()的调用将当前执行的程序集加载到当前的应用程序域中,并将.CodeBase属性传递给CreateInstanceFromAndUnwrap,将尝试在实例化目标代理之前将目标程序集(位于应用程序路径或GAC中)加载到目标域中。目前,除了可能的出血问题之外,我认为这个代码没有任何问题。
如果您有多个应用程序域,那么您将在LoadFrom上下文中看到程序集的多个副本,因为在AppDomains中共享的唯一程序集是mscorlib.dll。除非我误解了你的问题,否则我认为你看到的是正常的。
https://stackoverflow.com/questions/13440030
复制相似问题