投稿を更新していただきありがとうございます。この 1 行は、この動作が発生している理由を示しています。
メソッドLoadFrom
は定義どおりに機能します。
ロード元コンテキストには、プローブによって検索されたディレクトリに含まれていないパスをユーザーが指定したアセンブリが含まれています。LoadFrom、CreateInstanceFrom、および ExecuteAssembly は、パスによってロードされるメソッドの例です。
プローブとは、GAC、ホスト アセンブリ ストア、実行中のアセンブリのフォルダー、または実行中のアセンブリのプライベート フォルダーを調べて、アセンブリを見つけるプロセスです。
既にアセンブリを参照しているため、パラメーターで指定した名前と一致する、既に読み込まれているアセンブリを返すだけです。
お探しの方法は ですLoadFile
。MSDN は次のように述べています。
LoadFile メソッドを使用して、ID が同じでパスが異なるアセンブリを読み込んで調べます。LoadFile はファイルを LoadFrom コンテキストにロードせず、LoadFrom メソッドのようにロード パスを使用して依存関係を解決しません。
その他のリソース
Suzanne Cook が彼女のブログ .NET CLR Notes に書いたLoadFile vs. LoadFrom 。
注意してください - これらは同じものではありません。
LoadFrom() は Fusion を通過し、別のパスにある別のアセンブリにリダイレクトできますが、LoadFrom コンテキストに既に読み込まれている場合は同じ ID でリダイレクトできます。LoadFile() は Fusion を介してまったくバインドしません。ローダーは先に進み、呼び出し元が要求したものを正確に*ロードします。Load コンテキストも LoadFrom コンテキストも使用しません。
そのため、LoadFrom() は通常、要求したものを提供しますが、必ずしもそうとは限りません。LoadFile() は、要求されたものを正確に求めている人向けです。(*ただし、v2 以降、ポリシーは LoadFrom() と LoadFile() の両方に適用されるため、LoadFile() は必ずしも正確に要求されたものとは限りません。また、v2 以降、その ID を持つアセンブリが必要なものを正確に読み込むには ReflectionOnlyLoadFrom() を使用しますが、その方法で読み込まれたアセンブリは実行できないことに注意してください)。
LoadFile() にはキャッチがあります。バインディング コンテキストを使用しないため、その依存関係はそのディレクトリで自動的に検出されません。それらが Load コンテキストで使用できない場合は、それらにバインドするために AssemblyResolve イベントをサブスクライブする必要があります。