Managed Add-In Framework(MAF)を使用したプラグインベースのアーキテクチャを備えたプログラムがあります。アドインアセンブリを独自のプロセスで実行する方法でロードしようとしています。ロードする他のアセンブリを探す場所を指定できます。以下は、私が試した2つの異なる方法と、それらが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を使用しないことをお勧めします。