卸载后 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 的问题的主要内容,如果未能解决你的问题,请参考以下文章

卸载 appdomain 后程序集仍然存在

vb.net编程,如何使用 appdomain 实现某进程DLL动态加载和卸载?

AppDomain 详解二-C#中动态加载和卸载DLL

即使我卸载 appdomain,我的 dll 也不会卸载

AppDomain 支持在 UnityEngine 中已失效,有啥方法可以卸载 dll?

从 AppDomain 卸载 .DLL 需要帮助 - 即使使用 ShadowCopy 仍无法正常工作