.net AppDomain卸载后未卸载程序集?

.net AppDomain卸载后未卸载程序集?,.net,appdomain,.net-assembly,.net,Appdomain,.net Assembly,我使用AppDomain加载程序集,然后卸载它们 然而,我有一个非常严重的问题。卸载AppDomain后,我仍然可以在process explorer中看到一些程序集被多次加载! 为什么会有剩余的已加载程序集?AppDomain.Unload不会释放AppDomain加载的所有内存吗 您可以在所附图像中看到: AppDomains总数为3(我在流程的生命周期中创建了3个AppDomains) AppDomains:1(当前仅存在1个AppDomain) 由于某些原因,正如您在加载的DLL一节中所

我使用AppDomain加载程序集,然后卸载它们

然而,我有一个非常严重的问题。卸载AppDomain后,我仍然可以在process explorer中看到一些程序集被多次加载! 为什么会有剩余的已加载程序集?AppDomain.Unload不会释放AppDomain加载的所有内存吗

您可以在所附图像中看到:

AppDomains总数为3(我在流程的生命周期中创建了3个AppDomains)

AppDomains:1(当前仅存在1个AppDomain)

由于某些原因,正如您在加载的DLL一节中所看到的那样,程序集被多次加载到进程中

代码:

是的,LocalStatusFetcher确实继承了MarshalByRefObject


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


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

也许你也在主AppDomain中加载程序集。顺便说一句,图像分辨率太低了,我什么也看不见。我想到了这一点,但事实并非如此(通过调试器检查)-此外,程序集仅在加载到多个AppDomain时才会出现多次。关于图片质量-这是stackoverflow实现的,如果您获取图像的url并将其粘贴到另一个选项卡中,您将能够很好地看到它。从屏幕截图中可见的程序集都是.NET Framework程序集。您的程序集也会发生这种情况吗?是的。根据我的观察,在创建新AppDomain之前加载的所有程序集都会发生这种情况。e、 g.如果在创建新AppDomain之前未加载程序集,则在卸载新AppDomain时会正确释放程序集。您能否发布创建AppDomain并加载程序集的代码?当前程序集当然已加载到当前AppDomain,所以我不认为调用GetExecutionGassembly会有什么问题。此外,我知道其他应用程序域将加载这些程序集,但我不明白的是,为什么它在加载完成后不释放它们?我不认为我所看到的是正常的-应用程序域的概念是,在它发布之后-加载到它的所有程序集也都发布了…1。您如何将它们加载到备用应用程序域?2.您是否在当前应用程序域的任何上下文中引用加载的程序集?我正在引用它们并在当前上下文中使用它们。这不是问题。我希望它们被加载-问题是为什么它们被加载两次?我卸载了另一个AppDomain,它们应该只被加载一次。嗯,真的很有趣。能否确认对当前域中的
AppDomain.CurrentDomain.GetAssemblys()
的调用只列出了要加载的程序集一次?
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);
}