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

标签 c# .net 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);

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

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

_addin = _token.Activate<IOpenSourceAutomationAddInv2>(_process,AddInSecurityLevel.FullTrust);

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

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

最佳答案

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

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

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

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

关于c# - 使用 MAF 加载程序集的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14042860/

相关文章:

c# - 使用 exceldatareader 将 Excel 工作表行 ID 获取到数据集中

.net - EF 4.2 自动编译的 linq 查询的影响

c# - 使用 dll 中的 ViewModel 进行 UserControl

c# - 如何将自动映射器与 System.AddIn 一起使用?

c# - 将 IAsyncResult 模式转换为任务

C# - 查找我机器的本地 IP 地址而不是虚拟机的 IP 地址

c# - 如何简化在主窗体和子窗体之间传递的设置值的代码

.net - WPF 中的 MVVM - UserControls 和 GMap.NET

c# - System.AddIn (Maf) 插件之间的互连

wpf - 在一个 UI 线程上跨多个 AppDomain 运行 WPF 有什么问题?