用MAF加载组件的正确方法

本文关键字:方法 组件 MAF 加载 | 更新日期: 2023-09-27 17:49:30

我有一个基于插件架构的程序,使用托管插件框架(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);

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

AddInProcess _process;
_process = new AddInProcess(Platform.AnyCpu);
_addin = _token.Activate<IOpenSourceAutomationAddInv2>(_process,AddInSecurityLevel.FullTrust);

此方法将每个加载项加载到其自己的进程中,因此即使单个加载项崩溃,也不会影响主机。问题是我还没能弄清楚是否有可能告诉加载项在哪里寻找额外的程序集。它们只会在自己的目录中查找,而不会在主机的目录中查找。

为了完成我正在寻找的东西,使用MAF的最佳方法是什么?我需要能够加载我的外接程序是这样一种方式,从主机分开,因为我不写外接程序。我无法控制他们的代码,所以我需要确保他们不会使主机崩溃。我还需要能够指定外接程序应该从哪里加载程序集,因为它们将在自己的子目录中,并且需要从主机目录加载程序集。如果可能的话,我也不喜欢使用GAC。

用MAF加载组件的正确方法

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

关于引用,可能每个插件都查看其私有目录是正确的,否则如果你有两个插件编译了不同的不兼容的引用,你就麻烦了。

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

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