【问题标题】:Proper way to load assemblies with MAF使用 MAF 加载程序集的正确方法
【发布时间】:2012-12-26 15:50:32
【问题描述】:

我有一个使用托管插件框架 (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。

【问题讨论】:

  • 我对此进行了一些研究,但我认为这两种方法都不可行。在创建子应用程序域的情况下,无法捕获其中的异常。你可以得到它的事件通知,所以这对你没有好处。 Process 方法无法修复,因为 MS 没有让您参与实际的流程创建步骤(他们为什么如此有意阻碍开发人员?)。在 Process 对象创建和启动之间,您无法参与其中。我看到了两种解决方案:为您的插件创建一个包装进程或使用 GAC。
  • 你看过这篇文章吗? stackoverflow.com/questions/4145713/…

标签: c# .net maf


【解决方案1】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 2010-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-11
    • 2012-07-07
    • 2017-09-14
    相关资源
    最近更新 更多