有没有可能避免将某些程序集加载到“AppDomain”中?

3
我需要将SomeMixedAssembly.dll加载到附加域中(即不是主域),并在完成任务后卸载该域。此外,SomeMixedAssembly.dll还会加载SomeMixedAssembly_2.dll,后者对其工作很重要。这两个程序集都是混合的,而且不是我编写的。这不是问题,但问题是SomeMixedAssembly.dll还将SomeMixedAssembly_2.dll加载到了主域中。
有可能避免将某些程序集加载到主AppDomain中吗?

2
你需要创建自己的代理,处理默认域和你创建的域之间的通信。该代理随后在其自己的域中加载,并且是SomeMixedAssembly中定义的类型的包装器。不要直接通过代理泄露任何SomeMixedAssembly中的类型。这应该可以阻止SomeMixedAssembly以及它的依赖项在默认域中被加载。 - Igor
1
为了澄清Igor的评论,汇编并没有自己加载到主域中。是把一个对象从辅助域复制到主域中,从而迫使类型在那里被加载。 - usr
我知道AppDomain.AssemblyResolve并使用代理。我的“HelloWorld”的示例在这里(git存储库):https://bitbucket.org/Andrey-Bushman/acadcui/wiki/Home 在该示例中,SomeMixedAssembly.dllAcCUI.dll,而SomeMixedAssembly_2.dllAcDbMgd.dll - Andrey Bushman
3
我想这里可以用“混合”一词来描述。AppDomains是一个纯粹的托管概念,只能隔离托管对象。任何由混合模式程序集中的原生代码分配的内存都不能被隔离。这是不可能的。原生代码的隔离边界是进程 - Hans Passant
@HansPassant,这是否意味着任何混合程序集都将始终加载到主AppDomain中? - Andrey Bushman
不是问题。如果我猜得对(为什么要猜测),这是关于本机代码分配的内存可见性的问题。在C代码中非常常见的全局变量,在运行在另一个AppDomain中的托管代码中同样是全局的。它是进程全局的。 - Hans Passant
1个回答

0
是的,你可以在程序集加载过程中进行干预,例如使用AppDomain.AssemblyResolve事件处理程序。但是程序集通常是按需懒加载的,你不能不加载它们并期望你的程序能正常工作。根据定义,加载到另一个AppDomain中的程序集不能自动像原始程序集一样工作。
但是如果你想从非常规的位置加载程序集、检查一些先决条件或者搜索错误,这种干预可能会很有用。

我知道它并使用它,但它对我没有帮助。您可以在此处查看我的“Hello World”问题:https://bitbucket.org/Andrey-Bushman/acadcui/wiki/Home - Andrey Bushman
我从你的代码中能看到唯一可能的原因:包含Bushman.AcadCUI.Section类的程序集可能直接或间接引用了Acdbmgd.dll。请在“ISection section =”行处设置断点并检查已加载的程序集。然后执行“step out”并再次检查。如果我的猜测正确,那么在这一步中加载了不需要的程序集。此时,IlSpy或Reflector可以帮助你。 - olk
它发生在 Program.cs 文件的第83行。 - Andrey Bushman
真的吗?在第83行你在taskDomain中调用DoWork。这是否意味着在第39行已经加载了不需要的程序集? - olk
让我们在聊天中继续这个讨论。点击此处进入聊天室 - olk
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接