卸载后 AppDomain 和使用的 DLL 的问题
Posted
技术标签:
【中文标题】卸载后 AppDomain 和使用的 DLL 的问题【英文标题】:Problems with AppDomain and used DLL after unload 【发布时间】:2012-09-20 07:39:11 【问题描述】:我有一个问题,加载到我的新 Appdomain 的 DLL 也加载到主 appdomain!
我有一个继承自 MarshalByRefObject 的“Servicebase”类。
现在我有不同的子类继承自这个基类。
这些子类应该在它们自己的应用程序域中实例化。
我用这段代码做的:
AppDomainSetup setup = new AppDomainSetup();
setup.ApplicationBase = Path.GetDirectoryName(dllFile);
setup.ApplicationName = Path.GetFileNameWithoutExtension(dllFile);
setup.LoaderOptimization = LoaderOptimization.MultiDomainHost;
setup.ShadowCopyFiles = "true";
setup.ConfigurationFile = AppDomain.CurrentDomain.SetupInformation.ConfigurationFile;
hostAppDomain = AppDomain.CreateDomain(setup.ApplicationName, AppDomain.CurrentDomain.Evidence, setup);
这行得通...
现在我使用以下代码创建我的实例:
host = hostAppDomain.CreateInstanceFrom(dllFile, className.Split(',')[0]);
当我现在检查“AppDomain.CurrentDomain.GetAssemblies()”时,我的实例程序集没有加载到我的主程序集中。
但是在执行这个之后:
var inst = (ServiceBase)host.Unwrap();
我当前的程序集也加载了 dll。
谁能告诉我为什么?我能做什么?
【问题讨论】:
【参考方案1】:ServiceBase 是否与派生类在同一个程序集中?
如果是,那么您应该将它们拆分为两个不同的程序集。一个带有契约(基类),另一个带有派生类。然后,您将不会从您的主项目中引用派生类程序集。只有合约程序集应该被主项目引用,并且只会在主 AppDomain 中加载。
【讨论】:
以上是关于卸载后 AppDomain 和使用的 DLL 的问题的主要内容,如果未能解决你的问题,请参考以下文章
vb.net编程,如何使用 appdomain 实现某进程DLL动态加载和卸载?