Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/309.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 用MAF加载组件的正确方法_C#_.net_Maf - Fatal编程技术网

C# 用MAF加载组件的正确方法

C# 用MAF加载组件的正确方法,c#,.net,maf,C#,.net,Maf,我有一个使用托管插件框架(MAF)的基于插件架构的程序。我正在尝试以一种方式加载我的外接程序集,它们在自己的进程中运行,并且我可以指定它们应该在哪里查找要加载的其他程序集。以下是我尝试过的两种不同方法,以及它们为什么不能100%起作用: AppDomain _domain; // Create application domain setup information. AppDomainSetup domaininfo = new AppDomainSetup(); // Configure

我有一个使用托管插件框架(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);
AppDomain\u域;
//创建应用程序域设置信息。
AppDomainSetup domaininfo=新的AppDomainSetup();
//配置
domaininfo.ApplicationName=PluginName;
domaininfo.ApplicationBase=MyPath;
domaininfo.PrivateBinPath=MyPath;
domaininfo.LoaderOptimization=LoaderOptimization.MultiDomain;
domaininfo.DisallowApplicationBaseProbling=false;
domaininfo.DisallowBindingRedirects=false;
domaininfo.DisallowCodeDownload=false;
domaininfo.DisallowPublisherPolicy=false;
System.Security.Policy.Evidence adevidence=AppDomain.CurrentDomain.Evidence;
//使用安装信息创建新的应用程序域。
_domain=AppDomain.CreateDomain(PluginName+“_-domain”,证据,domaininfo);
_addin=\u令牌.Activate(\u域);
此方法允许我告诉每个外接程序在新的应用程序域中运行,并且可以指定在何处查找其他程序集。这一点很重要,因为每个外接程序都位于其自己的子目录中,并且需要在与主机相同的目录中查找以加载其他程序集。此方法的问题是,如果外接程序存在未处理的异常,则会导致主机崩溃,因为它正在同一进程中运行

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

_addin = _token.Activate<IOpenSourceAutomationAddInv2>(_process,AddInSecurityLevel.FullTrust);
AddInProcess\u过程;
_进程=新的附加进程(Platform.AnyCpu);
_addin=_token.Activate(_进程,AddInSecurityLevel.FullTrust);
此方法将每个外接程序加载到其自己的进程中,以便单个外接程序崩溃时不会影响主机。问题是我无法确定是否可以告诉外接程序在何处查找其他程序集。他们只会在自己的目录中查找,而不会在主机的目录中查找


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

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

关于引用,每个外接程序查看其私有目录可能是正确的,否则,如果有两个外接程序使用不同的不兼容引用编译,则会遇到麻烦

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

  • 使用AddInProcess.exe.Config,可以将探测目录指定为inhttp://msdn.microsoft.com/en-us/library/823z9h8w.aspx
  • 在激活加载项之前,请将所有主机引用复制到加载项目录

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