我使用 AppDomain 来加载程序集然后卸载它们。
但是,我遇到了一个非常棘手的问题。卸载 AppDomain 后 - 我仍然可以在进程资源管理器中看到某些程序集被加载了多次!
为什么还有加载的程序集的剩余部分? AppDomain.Unload 不会释放 AppDomain 的所有已加载内存吗?
您可以在附图中看到:
总 AppDomain 为 3(我在进程的生命周期中创建了 3 个 AppDomain)
AppDomains:1(当前仅存在 1 个 AppDomain)
由于某种原因,正如您在下面的加载的 DLL 部分中看到的那样 - 程序集被多次加载到进程中。
Code:
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...
您加载到外部应用程序域中的程序集很可能会渗入到当前应用程序域中。有tons有多种可能发生这种情况的方法,但你的问题尤其是通过Assembly.GetExecutingAssembly().CodeBase
to the CreateInstanceFromAndUnwrap
方法。致电Assembly.GetExecutingAssembly()
将当前正在执行的程序集加载到current应用程序域,并传递.CodeBase
财产给CreateInstanceFromAndUnwrap
在实例化目标代理之前,将尝试将目标程序集(位于应用程序路径或 GAC 中)加载到目标域中。目前,除了可能出现的出血问题之外,我认为这段代码没有任何问题。
如果您有多个应用程序域,那么您将在 LoadFrom 上下文中看到程序集的多个副本,因为only跨 AppDomains 共享的程序集是 mscorlib.dll。除非我误解了你的问题,否则我认为你所看到的是正常的。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)