0

リフレクションによって作成されたときに間違ったアセンブリが使用されるという奇妙な状況があります。

これは私のセットアップです(簡略化):

Project1: クラス ライブラリ

Project2: クライアント アプリ

  • Project2 は、特定のパス (C:\Project1) からのリフレクションによって Project1.dll を作成します。
  • Project2 はさらに、さまざまな機能のために Project1.dll への参照を持っています。この参照は、C:\Project2\bin\Debug の Project1.dll をコピーします。

関連するリフレクション コードは次のとおりです。
Assembly assembly = Assembly.LoadFrom(path);

問題: リフレクションによって Project1 を呼び出すと、C:\Project1 パスを指定しても、実際には bin\Debug コピーが使用されます (これは必ずしも正しいバージョンではありません)。

質問: 最初に見つかったバージョンではなく、指定したパスが使用されるようにするにはどうすればよいですか?

私の理想的な解決策は、Project1 をリフレクション用と参照用の 2 つに分割することですが、それは私の場合のオプションではありません (そうですが、追加の問題があります)。

ありがとう、
サイモン

4

1 に答える 1

2

投稿を更新していただきありがとうございます。この 1 行は、この動作が発生している理由を示しています。

メソッドLoadFromは定義どおりに機能します。

ロード元コンテキストには、プローブによって検索されたディレクトリに含まれていないパスをユーザーが指定したアセンブリが含まれています。LoadFrom、CreateInstanceFrom、および ExecuteAssembly は、パスによってロードされるメソッドの例です。

プローブとは、GAC、ホスト アセンブリ ストア、実行中のアセンブリのフォルダー、または実行中のアセンブリのプライベート フォルダーを調べて、アセンブリを見つけるプロセスです。

既にアセンブリを参照しているため、パラメーターで指定した名前と一致する、既に読み込まれているアセンブリを返すだけです。

お探しの方法は ですLoadFile。MSDN は次のように述べています。

LoadFile メソッドを使用して、ID が同じでパスが異なるアセンブリを読み込んで調べます。LoadFile はファイルを LoadFrom コンテキストにロードせず、Lo​​adFrom メソッドのようにロード パスを使用して依存関係を解決しません。


その他のリソース

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 イベントをサブスクライブする必要があります。

于 2014-07-14T21:41:50.573 に答える