在新的 AppDomain 中加载插件

Posted

技术标签:

【中文标题】在新的 AppDomain 中加载插件【英文标题】:Loading plugin's in new AppDomain 【发布时间】:2012-04-24 12:55:16 【问题描述】:

我知道有很多关于在新应用程序域中加载插件的线程。我的错我以前没有读过它们。我有这个学校项目-基于插件的应用程序,几乎完成了。除了重要的一点 - 插件必须加载到新域中.. 我使用这篇文章创建了基于插件的应用程序http://www.codeproject.com/Articles/6334/Plug-ins-in-C

我目前正赶上项目截止日期,但我被同一应用程序域中的插件困住了。 如果可以对链接中的应用程序进行一些简单的更改以在单独的应用程序域中加载插件,您能否建议我?我真的不会从一开始就编写应用程序。 :(

感谢您的所有建议。

【问题讨论】:

在最后几个小时工作...啊啊学校 :) 组装前插件Assembly = Assembly.LoadFrom(FileName);创建一个新的 AppDomain :msdn.microsoft.com/en-us/library/ms173140(v=vs.80).aspx 伙计们,谢谢你的回答,我知道我可能不得不使用 System.AddIn,但是有没有办法通过 System.AddIn 传递 UserControl? 【参考方案1】:

试试这个

AppDomain domain = AppDomain.CreateDomain("domain name");

// TODO: configure appdomain as needed

// to load the dll and get a type you can reference in your current appdomain
string pathToDll = @"C:\somedir\Mydll.dll";
Type myType = typeof(SomeType);
SomeType myObj = (SomeType)domain.CreateInstanceFromAndUnwrap(pathToDll, myType.FullName);


// to just load the dll into the new appdomain
byte[] file = File.ReadAllBytes(pathToDll);
domain.Load(file);

【讨论】:

【参考方案2】:

我曾经尝试将我的 WinForms 应用程序划分为单独的 AppDomains,这并不容易。但是,在您的情况下,这应该不是很困难。

尝试创建一个新的 AppDomain 并在其中加载您的插件类型。然后使用反射或通用基础接口与该对象通信(请记住,如果您想避免将插件程序集加载到主机 AppDomain 中,则不能在主机应用程序中引用插件类型)。

您可能还想查看System.AddIn namespace - 它专门用于简化插件开发。

【讨论】:

谢谢 Marek,System.AddIn 看起来很棒,但如果我理解得很好,它似乎要重新编码至少一半的应用程序。我必须创建合同、HostView 等...但我不知道如何为 UserControl 使用合同等:(【参考方案3】:

您可以使用 System.Addin。 查看此示例(或此 CodePlex 页面中的其他示例)

http://clraddins.codeplex.com/releases/view/9454

【讨论】:

以上是关于在新的 AppDomain 中加载插件的主要内容,如果未能解决你的问题,请参考以下文章

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

ApplicationManager.CreateObject 无法在新的 AppDomain 中加载程序集

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

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

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

C# 在 appdomain 调用方法中加载 dll,而不会再次加载 dll