gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 21:20:16 27 4
gpt4 key购买 nike

我正在使用 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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com