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

标签 .net appdomain .net-assembly

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

但是,我遇到了一个非常奇怪的问题。卸载 AppDomain 后 - 我仍然可以在进程资源管理器中看到某些程序集被多次加载!
为什么有加载的程序集的剩余部分? 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 ......

enter image description here

最佳答案

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

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

关于.net - AppDomain 卸载后未卸载程序集?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13440030/

相关文章:

c# - 如何为 .NET 应用程序域重新加载程序集?

Azure 环境中的 IIS AppDomain 卸载

.net - 查找给定程序集中不需要的类

c# - 无法在 GetTypes 方法上加载文件或程序集错误

c# - 在 C# 中访问实例级自定义属性

c# - .NET Bitmap.Load 方法在不同的计算机上产生不同的结果

.net - 使用 common.logging 动态设置 log4net 属性

c# - 从finallys抛出异常时,不评估捕获 block

.net - 如何在应用程序域之间传递事件?

c# - 找出所有 DLL 的依赖关系?