0

プラグインのさまざまな程度の分離をサポートする必要があるシステムに取り組んでいます。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 プロジェクトをパイプラインに含めることができないため、次の理由で問題が発生します。

  1. My.PlugIn.AddIn の読み込み中に問題が発生しました - 依存関係 My.AddIn.Shared が見つかりません (AddInViews にアドイン ベースの単一の dll が含まれている場合)
  2. IContract タイプに透過プロキシをキャストできません - (colyLocal=true で AddInViews に複数の dll が含まれている場合)

また、My.PlugIn.AddIn の単一のクラスのみに言及する価値があります。AddInBaseAttribute で装飾されており、共有アセンブリには単一のクラスがありません。

そのため、どちらの状況でもアドインをロードできません。イベントのカスタム ハンドラで問題を解決したかった

AppDomain.CurrentDomain.AssemblyResolve
AppDomain.CurrentDomain.ReflectionOnlyAssemblyResolve

AddInStore.Rebuild を呼び出す前ですが、これはホスト アプリが実行しているドメインにのみ影響し、System.AddIn.Hosting.AddInStore によって内部的に作成されるドメイン「アドイン モデル検出ワーカー AD」には影響しません。

このクラスは静的であるため、ドメインの作成をオーバーライドする方法はありません。また、内部ドメイン解決エラーにアクセスできるようにするイベントも提供しません。カスタム アセンブリ解決ルールを挿入する方法や、内部の appDomain にメインの解決イベントを強制的に継承させる方法はありますか?

4

0 に答える 0