4

リフレクションを介してアセンブリを動的にロードしようとしています。私はこのようなフォルダ構造を持っています:

project
  \-- BIN
       |-- myApp.exe
       |-- SOMEEXTENTION1
       |    |-- someExtention1.dll
       |    \-- itsDependency1.dll
       |         
       |-- SOMEEXTENTION2
            |-- someExtention2.dll
            \-- itsDependency2.dll

リフレクションを使用してsomeExtentionをロードできます。実行中にsomeExtentionがitsDependencyを探すときに問題が発生します。ドット ネットは BIN フォルダーを検索します。そこにはありません。Appdomain の AssemblyResolve イベントが発生しています...

このイベントをトラップしています。ResolveEventArgs で、ロードする必要があるアセンブリの名前を取得します。問題は、RequestingAssembly を取得できないことです。ResolveEventArgs のそのプロパティは常に空です。独自のEXTNフォルダーを直接見ることができるように、要求しているアセンブリが必要です。それがなければ、すべての EXTN フォルダーを調べる必要があり、私の場合は非常に大きくなる可能性があります。

RequestingAssembly にはプロパティ Location があり、この msdn article によれば、物理ファイルへのパスが含まれています。この記事では、このプロパティが Nothing になる状況についても説明します。そこで説明されている Load-Context がわかりません。

どんな助けもかなりのものです...

4

1 に答える 1

4

私が実験で見つけたものから(サポートされている検索結果はありません)、アセンブリを動的にロードするとき、フォルダー名はアセンブリ名と一致してはなりません。そのとき何が起こるか正確にはわかりませんが、ローダー機構の内部で何かがおかしくなっています。

ちなみに、LoadFrom メソッドでアセンブリをロードすると、load-from-context でロードされます。このコンテキストでは、依存関係アセンブリは、最初にアプリケーション ベースを調べてから、アセンブリ自体のフォルダーを調べることによって解決されます。私の場合、これは依存関係の解決の問題を解決します。

欠点として、load-from が依存関係の解決に失敗し、AssemblyResolve イベントがトリガーされた場合、アセンブリの要求は利用できないことがわかりました。これは、アセンブリを要求するパスを特定できなかったことを意味します。

LoadFile メソッドを使用すると、load-from を使用するのではなく、依存関係がサブフォルダーから自動的に解決されません。むしろ、AssemblyResolve イベントがトリガーされます。この場合、ResolveEventArgs には要求しているアセンブリ プロパティが含まれます。ユーザーコードがターゲットパスを簡単に決定できる場所から。その後、ユーザー コードは依存関係を読み込むことができます。

于 2012-04-20T11:05:16.400 に答える