【发布时间】:2016-10-26 18:43:29
【问题描述】:
我需要将SomeMixedAssembly.dll 加载到附加域(即它不是主域)并在完成任务后卸载该域。 SomeMixedAssembly.dll 还加载了工作所必需的 SomeMixedAssembly_2.dll。两个程序集都是混合的,不是我写的。这不是问题,但问题是SomeMixedAssembly.dll 也将SomeMixedAssembly_2.dll 加载到主域。
是否可以避免将一些程序集加载到主AppDomain?
【问题讨论】:
-
您需要创建自己的代理来处理默认域和您创建的域之间的通信。然后将该代理加载到其自己的域中,并且是
SomeMixedAssembly中定义的类型的包装器。不要直接通过代理泄漏SomeMixedAssembly中的任何类型。这应该会阻止SomeMixedAssembly加载到默认域及其依赖项中。 -
为了澄清 Igors 的评论,程序集没有将自身加载到主域中。 您是通过将对象从辅助域复制到主域来强制将类型加载到那里。
-
我知道
AppDomain.AssemblyResolve,我使用代理。我的“HelloWorld”示例在这里(git 存储库):bitbucket.org/Andrey-Bushman/acadcui/wiki/HomeSomeMixedAssembly.dll是AcCUI.dll,SomeMixedAssembly_2.dll是AcDbMgd.dll。 -
我想“混合”这个词在这里适用。 AppDomain 是一个纯托管的概念,它们只隔离托管对象。混合模式程序集中本机代码分配的任何内存都不是隔离的。不可能。本机代码的隔离边界是一个进程。
-
@HansPassant,这是否意味着任何混合程序集总是将被加载到主
AppDomain也 ?
标签: c# .net .net-assembly appdomain