リフレクションのために C# で実行時にアセンブリとそのすべての依存関係を読み込むにはどうすればよいですか?
-
09-06-2019 - |
質問
私は自分用のユーティリティを作成しています。これは、一部は C# Reflection を学習するための練習として、もう一部は実際に作成されたツールを自分で使用したいためです。
私が求めているのは、基本的にアプリケーションをアセンブリに指定し、エクスポートされた HTML フォームにフィールドとして含めるプロパティを選択する特定のクラスを選択することです。このフォームは、ASP.NET MVC アプリでビューの先頭として使用されます。
私が使用したいアプリケーションに Subsonic オブジェクトを使用しているので、これは合理的なはずであり、データ型に応じて出力 HTML を変えるなどの機能を組み込むには、Reflection がこれを実現する方法であると考えました。
しかし、私が探しているものは、とらえどころのないもののようです。OpenFileDialog を通じて選択された DLL/EXE を開始点として取得し、ロードしようとしています。
String FilePath = Path.GetDirectoryName(FileName);
System.Reflection.Assembly o = System.Reflection.Assembly.LoadFile(FileName);
これは正常に動作しますが、Subsonic で生成されたオブジェクトは実際には Subsonic.dll などで定義されたオブジェクト タイプでいっぱいであるため、それらの依存オブジェクトは読み込まれません。入力:
AssemblyName[] ReferencedAssemblies = o.GetReferencedAssemblies();
これにも、まさに私が期待していたものが含まれています。ただし、私が理解しようとしているのは、オブジェクトの掘り下げが適切に機能するように、これらのアセンブリをロードする方法です。これらのアセンブリが GAC 内、または実行中の実行可能ファイルのディレクトリ内にある場合は、名前を指定してそれらを読み込むことができることは理解していますが、このユース ケースには当てはまらない可能性が高く、これが私の主なユース ケースです。
つまり、結局のところ、ファイル名で始まり、その結果、型、プロパティ、メソッドなどの完全に Reflection で参照可能なツリーを生成する、特定のアセンブリとそのすべての任意のアセンブリをどのようにロードするかということになります。
Reflector のようなツールがこれを行うことは知っていますが、それを実行するための構文が見つかりません。
解決
ここにいくつかのオプションがあります:
- 添付する
AppDomain.AssemblyResolve
そして別のことをするLoadFile
要求されたアセンブリに基づいて。 - 別のスピンアップ
AppDomain
ディレクトリをベースとして使用し、その中にアセンブリをロードしますAppDomain
.
オプション 2 を使用することを強くお勧めします。そのほうがクリーンで、後ですべてのアセンブリをアンロードできるためです。また、アセンブリをリフレクトする必要があるだけの場合は、アセンブリをリフレクション専用コンテキストで読み込むことを検討してください (「 Assembly.ReflectionOnlyLoad
).