无法在新的 appDomain 中加载程序集

Posted

技术标签:

【中文标题】无法在新的 appDomain 中加载程序集【英文标题】:Unable to load assembly in new appDomain 【发布时间】:2012-09-18 21:42:09 【问题描述】:

我有一个 mvc3 应用程序。 我的应用程序项目中有一个名为“Plugins”的子文件夹

存储在该文件夹中的所有 dll 都应该在运行时更新,所以我们放下 appdomain 并重新加载新版本的 dll,所以我尝试在不同的 appDomain 中加载所有插件 dll 并设置它是 shadowCopy 属性。

浏览 SO、msdn 和一些博客,我得到了这个“解决方案”。 (这是在我的 Application_Start 期间调用的)

static AppDomain pluginDomain;
static PluginHolder()
        
            AppDomainSetup domainSetup = AppDomain.CurrentDomain.SetupInformation;
            domainSetup.ApplicationName = "Plugins";
            domainSetup.PrivateBinPathProbe = domainSetup.PrivateBinPath;
            domainSetup.PrivateBinPath = GetPluginsDirectory();
            domainSetup.ShadowCopyFiles = "true";
            domainSetup.ShadowCopyDirectories = domainSetup.PrivateBinPath;

            pluginDomain= AppDomain.CreateDomain("Plugins", null, domainSetup);
            var item = pluginDomain.Load(File.ReadAllBytes(GetPluginsDirectory() + "Item.dll"));
        

“Item.dll”是我试图加载的 dll。最后一行抛出“无法加载文件或程序集项或其依赖项之一”。 这似乎是其他人成功的方式,但它对我不起作用。

我以前没有使用 AppDomains 的经验,所以我不确定如何解决这个问题,或者我是否正确地解决了它。

我的程序集通过新的 AppDomain 加载是否可行?

【问题讨论】:

【参考方案1】:

要破译这类错误消息,您应该使用Assembly Binding Log Viewer。

还要注意AppDomain.Load(byte[])文档页面的备注部分。如果要在新的 AppDomain 上加载程序集,则应改用 CreateInstanceAndUnwrap。

如果您想在 .NET 中实现插件引擎,那么您将需要了解 AppDomain、程序集解析和加载,然后选择用于来自不同 AppDomain 的对象之间的通信机制。大多数关于 .NET 和 CLR 的好书都包含一两章关于 AppDomain 的内容,它们会让您快速上手。现在就跨 AppDomain 通信而言,您可以使用 WCF 或 .NET Remoting (MarshalByRefObject)。

祝你好运。

【讨论】:

以上是关于无法在新的 appDomain 中加载程序集的主要内容,如果未能解决你的问题,请参考以下文章

在新的 Appdomain 中加载程序集,需要完全信任父程序集

在 AppDomain 问题中加载具有依赖项的程序集

在不同的 AppDomain 中加载具有依赖项的程序集

在新的 AppDomain 中加载插件

在新的 appdomain 中加载 C 模块失败

无法在 appDomain 中加载程序集