DOBON.NET DOBON.NETプログラミング掲示板過去ログ

参照アセンブリが参照するアセンブリの位置について

環境/言語:[WinXP/Vista、.NET 2.0]
分類:[.NET]

こんにちは。

あるアセンブリがリフレクションで動的ロードされる、プラグイン式のようなアプリがあります。

この動的ロードされるアセンブリ(A.dll)が以下のような配置のとき、
A.dllが静的に参照しているアセンブリ(B.dll)をうまくロードしてくれません。
(B.dllはアプリ.exeにプラグインとして認識されないものとします)

アプリ.exe
└ plugin
  ├ filter1
  | ├ A.dll
  | └ B.dll
  ├ filter2
  | ├ ...

B.dllをアプリ.exeと同じ場所に移動させると動きます。

プラグイン単位で必要なファイルをサブフォルダに纏める といった
配置を可能としたいのですがどうすれば解決できるのでしょうか…

よろしくお願いします
プラグインごとに異なる AppDomain でロードするなら、AppDomain を作成する際に AppDomainSetup.PrivateBinPath にそのパスを追加すれば良さそうです。

現在の AppDomain に PrivatePath を追加するメソッドもありますが、これはすでに Obsolete ですね。
プラグインを配置する際に .exe.config ファイルを修正していいのなら、/configuration/runtime/assemblyBinding/probing 要素で検索パスを追加することができます。
バージョン指定なら probing ではなく /configuration/runtime/assemblyBinding/dependentAssembly/codeBase の方が必要です。
これらについては、filter2 のプラグインが使用する dll の検索の際にもこのパスを使用することになるのに注意してください。

AppDomain の AssemblyResolve イベントで独自に追加アセンブリをロードする方法もあります。適切なアセンブリを検索するのは難しいかもしれませんが。この場合も、filter2 のプラグインが使用する dll の検索の際にもイベントが発生し得ます。まあ、同じ AppDomain にロードする以上必然ですが。

あとは、System.AddIn(.NET 3.5 以降)などの拡張用の機構を使用することも考えられます…が、.NET 2.0 ですか…。
お返事ありがとうございます。

アセンブリを配置するだけで機能するようにしたいので、configではなく
別AppDomainを考えてみます。実は以前、ロードしたアセンブリの解放をしたい件で
AppDomainを調べたことがあるのですが、ちょっと難しくて挫折した覚えがあります^^;

いろいろ調べてみて、行けそうであれば解決済みにします。
遅くなりましたが、方針が決まったので解決とさせていただきます
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板