1

背景
まず、私は他の場所で解決策を探し、この解決策を見つけましたが、これは私の問題を解決しません。

Visual Studioのメインプロジェクトで参照されているアセンブリがありますが、サブフォルダーではなく、プロジェクトの外部からアセンブリを読み込む必要があります。呼び出しでアセンブリをロードできます...

System.Reflection.Assembly.LoadFrom(myExternalAssemblyPath);

...しかし、プログラムは実行されず、次のエラーが発生します。

FileNotFoundExceptionは処理されませんでした

ファイルまたはアセンブリ'MyAssembly、Version = 2.0.0.0、Culture = neutral、PublicKeyToken=null'またはその依存関係の1つを読み込めませんでした。システムは、指定されたファイルを見つけることができません。

ロードするための呼び出しの前にアセンブリを呼び出すことはありませんが、プログラムは、Main関数に入る前であっても、DLLがプログラムのフォルダーにあることを期待しています。

Quesiton:
Visual Studioでこれを参照するようにプログラムを取得し、実際にプログラムを実行するときに別の場所からロードするにはどうすればよいですか?プログラムにロードを待機するように指示するために、どこかに指定する必要のあるディレクティブはありますか?他に解決策はありますか?

注:フォルダーとDLLをPATH変数に追加したくありません。それは実行可能な解決策ではありません。

4

1 に答える 1

3

秘訣はAssemblyResolve、アプリケーションドメインにイベントを実装することです。

http://msdn.microsoft.com/en-us/library/system.appdomain.assemblyresolve.aspx

これは、ランタイムがロードしようとし、デフォルトの検索戦略を使用して見つけることができないアセンブリを見つけるのに役立ちます。これは簡単なはずです。ランタイムは欠落しているアセンブリごとにハンドラーを呼び出し、カスタムパスから自分でロードしてハンドラーから戻る必要があります。

覚えておくべき重要なポイント:.NETでは、JITはメソッドが呼び出される前にメソッドを(ネイティブコードに)完全に処理します。Mainメソッドが、ロードしようとしているアセンブリのタイプまたはメソッドを使用している場合、Main実行までは到達しません。したがって、Mainはアセンブリローディングのみを設定する必要があります。他のすべてのコード(特に問題のアセンブリに関連するコード)は別のメソッドに移動する必要があるため、個別にJITされます。

于 2012-06-01T17:33:26.890 に答える