6

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

在此处输入图像描述

4

1 回答 1

2

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

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

于 2012-11-26T01:50:22.260 回答