Roy*_*nik 5 .net appdomain .net-assembly
我正在使用AppDomain来加载程序集然后卸载它们.
但是,我有一个非常严重的问题.在卸载AppDomain之后 - 我仍然可以在进程资源管理器中看到一些程序集被多次加载!为什么有装载组件的剩余部分?AppDomain.Unload不会释放所有AppDomain加载的内存吗?
您可以在附件中看到:
AppDomains总数为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);
}
Run Code Online (Sandbox Code Playgroud)
是的,LocalStatusFetcher确实继承了MarshalByRefObject ......

您加载到外部应用程序域中的程序集很有可能会渗入到当前应用程序域中。发生这种情况的方法有很多,但您的问题尤其是传递Assembly.GetExecutingAssembly().CodeBase给CreateInstanceFromAndUnwrap方法。调用将Assembly.GetExecutingAssembly()当前正在执行的程序集加载到当前应用程序域中,并将.CodeBase属性传递给
CreateInstanceFromAndUnwrap将尝试在实例化目标代理之前将目标程序集(位于应用程序路径或 GAC 中)加载到目标域中。目前,除了可能出现的出血问题之外,我认为这段代码没有任何问题。
如果您有多个应用程序域,那么您将在 LoadFrom 上下文中看到程序集的多个副本,因为跨 AppDomains 共享的唯一程序集是 mscorlib.dll。除非我误解了你的问题,否则我认为你所看到的是正常的。
| 归档时间: |
|
| 查看次数: |
1511 次 |
| 最近记录: |