【问题标题】:Assemblies not unloading after AppDomain unload?AppDomain 卸载后程序集未卸载?
【发布时间】: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


【解决方案1】:

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

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

【讨论】:

  • 当前程序集当然已经加载到当前应用程序域,所以我看不出调用 GetExecutingAssembly 会有什么问题。此外,我知道其他应用程序域会加载这些程序集,我不明白的是为什么它在完成后不释放它们?我不认为我看到的是正常的 - 应用程序域的概念是在它发布之后 - 加载到它的所有程序集也会被释放......
  • 1.您如何将它们加载到备用应用程序域中? 2.您是否在当前应用程序域的任何上下文中引用加载的程序集?
  • 我正在引用它们并在当前上下文中使用它们。这不是问题。我希望它们被加载 - 问题是为什么它们被加载两次?我卸载了另一个 AppDomain,它们应该只加载一次。
  • 嗯,确实很有趣。您能否确认在当前域中对AppDomain.CurrentDomain.GetAssemblies() 的调用列出了您正在加载的程序集一次?
猜你喜欢
  • 2021-09-11
  • 2010-09-12
  • 1970-01-01
  • 1970-01-01
  • 2011-01-09
  • 2016-08-12
  • 1970-01-01
相关资源
最近更新 更多