使用MAF加载程序集的正确方法

Bri*_*ian 8 .net c# maf

我有一个使用托管外接程序框架(MAF)的基于插件的体系结构的程序.我试图以他们自己的进程中运行的方式加载我的加载项程序集,我可以指定他们应该在哪里寻找要加载的其他程序集.以下是我尝试过的两种不同的方法以及为什么它们不能100%工作:

AppDomain _domain;

// Create application domain setup information.
AppDomainSetup domaininfo = new AppDomainSetup();

// Configure
domaininfo.ApplicationName = PluginName;
domaininfo.ApplicationBase = MyPath;
domaininfo.PrivateBinPath = MyPath;
domaininfo.LoaderOptimization = LoaderOptimization.MultiDomain;
domaininfo.DisallowApplicationBaseProbing = false;
domaininfo.DisallowBindingRedirects = false;
domaininfo.DisallowCodeDownload = false;
domaininfo.DisallowPublisherPolicy = false;

System.Security.Policy.Evidence adevidence = AppDomain.CurrentDomain.Evidence;
// Create the new application domain using setup information.
_domain = AppDomain.CreateDomain(PluginName + "_Domain", adevidence, domaininfo);

_addin = _token.Activate<IOpenSourceAutomationAddInv2>(_domain);
Run Code Online (Sandbox Code Playgroud)

此方法允许我告诉每个加载项在新的应用程序域中运行,我可以指定在哪里查找其他程序集.这很重要,因为每个加载项都在其自己的子目录中,并且需要查找与主机相同的目录以加载其他程序集.此方法的问题是,如果加载项具有未处理的异常,则会导致主机崩溃,因为它在同一进程中运行.

AddInProcess _process;
_process = new AddInProcess(Platform.AnyCpu);

_addin = _token.Activate<IOpenSourceAutomationAddInv2>(_process,AddInSecurityLevel.FullTrust);
Run Code Online (Sandbox Code Playgroud)

此方法将每个加载项加载到其自己的进程中,因此单个加载项崩溃不会影响主机.这个问题是我无法弄清楚是否可以告诉加载项在哪里寻找其他程序集.它们只会查看其目录而不是主机的目录.

使用MAF以实现我正在寻找的最佳方式是什么?我需要能够加载我的加载项是这样一种方式将它们与主机分开,因为我没有编写加载项.我无法控制他们的代码所以我需要确保他们不会崩溃主机.我还需要能够指定加载项应该加载程序集的位置,因为它们将位于它们自己的子目录中,并且需要从主机目录加载程序集.如果可能的话,我也不愿意使用GAC.

Dav*_*rdi 1

如果插件不受信任,我认为更好的解决方案是使用单独的进程加载它,就像第二个解决方案中一样。

关于引用,每个插件查看其私有目录可能是正确的,否则如果您有 2 个使用不同的不兼容引用编译的插件,您就会遇到麻烦。

如果你真的想强制使用一个公共目录,我可以想到两种解决方案:

  • 使用 AddInProcess.exe.Config 您可以指定探测目录,如http://msdn.microsoft.com/en-us/library/823z9h8w.aspx
  • 在激活插件之前,将所有主机引用复制到插件目录