プラグインのさまざまな程度の分離をサポートする必要があるシステムに取り組んでいます。MAF を選択したのは、私のニーズに一致し、個別のプロセス分離と AppDomain 分離をすぐにサポートできるためです。
以下のサンプルでは、個別のプロセス分離を使用しています。
AddInStore.Rebuild(path);
...
var ap = new AddInProcess();
ap.Start();
var addin = token.Activate<MyAddInBase>(ap, AddInSecurityLevel.FullTrust);
ただし、ホストとプラグインの間で共有されるライブラリで MAF を機能させるには問題があります。私はプロジェクトを持っていると仮定しましょう(出力ディレクトリ付き):
- My.MainApp -> /.
- My.AddIn.Hosting -> /.
- My.AddIn.Shared -> /.
- My.AddIn.Contract -> /contracts
- My.PlugIn.HostSideAdapter -> /HostSideAdapters
- My.PlugIn.PlugInSideAdapter -> /PlugInSideAdapter
- My.PlugIn.AddIn -> /AddInViews
- My.SamplePlugin -> /addins/SamplePlugin
そして参考文献
My.MainApp <- My.AddIn.Hosting (copy local = true)
My.AddIn.Hosting <- My.AddIn.Shared (copy local = true)
<- My.AddIn.Contract (copy local = false)
My.PlugIn.AddIn <- My.AddIn.Contract (copy local = false)
My.PlugIn.HostSideAdapter <- My.AddIn.Hosting (copy local = false)
<- My.AddIn.Contract (copy local = false)
My.PlugIn.PlugInSideAdapter <- My.PlugIn.AddIn (copy local = false)
<- My.AddIn.Contract (copy local = false)
My.SamplePlugin <- My.PlugIn.AddIn (copy local = false)
<- My.AddIn.Contract (copy local = false)
これにより、各パイプライン ディレクトリに単一の dll を含むクリーンなビルドが得られます。すべて正常に動作し、パイプラインはビルドされ、有効で機能しています。
問題のあるものを追加するまで:
My.AddIn.Shared <- My.AddIn.Contract (copy local = false)
My.AddIn.Hosting <- My.AddIn.Shared (copy local = false)
My.PlugIn.AddIn <- My.AddIn.Shared (copy local = false)
My.PlugIn.AddIn プロジェクトをパイプラインに含めることができないため、次の理由で問題が発生します。
- My.PlugIn.AddIn の読み込み中に問題が発生しました - 依存関係 My.AddIn.Shared が見つかりません (AddInViews にアドイン ベースの単一の dll が含まれている場合)
- IContract タイプに透過プロキシをキャストできません - (colyLocal=true で AddInViews に複数の dll が含まれている場合)
また、My.PlugIn.AddIn の単一のクラスのみに言及する価値があります。AddInBaseAttribute で装飾されており、共有アセンブリには単一のクラスがありません。
そのため、どちらの状況でもアドインをロードできません。イベントのカスタム ハンドラで問題を解決したかった
AppDomain.CurrentDomain.AssemblyResolve
AppDomain.CurrentDomain.ReflectionOnlyAssemblyResolve
AddInStore.Rebuild を呼び出す前ですが、これはホスト アプリが実行しているドメインにのみ影響し、System.AddIn.Hosting.AddInStore によって内部的に作成されるドメイン「アドイン モデル検出ワーカー AD」には影響しません。
このクラスは静的であるため、ドメインの作成をオーバーライドする方法はありません。また、内部ドメイン解決エラーにアクセスできるようにするイベントも提供しません。カスタム アセンブリ解決ルールを挿入する方法や、内部の appDomain にメインの解決イベントを強制的に継承させる方法はありますか?