リフレクションのために C# で実行時にアセンブリとそのすべての依存関係を読み込むにはどうすればよいですか?

StackOverflow https://stackoverflow.com/questions/59220

  •  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 のようなツールがこれを行うことは知っていますが、それを実行するための構文が見つかりません。

役に立ちましたか?

解決

ここにいくつかのオプションがあります:

  1. 添付する AppDomain.AssemblyResolve そして別のことをする LoadFile 要求されたアセンブリに基づいて。
  2. 別のスピンアップ AppDomain ディレクトリをベースとして使用し、その中にアセンブリをロードします AppDomain.

オプション 2 を使用することを強くお勧めします。そのほうがクリーンで、後ですべてのアセンブリをアンロードできるためです。また、アセンブリをリフレクトする必要があるだけの場合は、アセンブリをリフレクション専用コンテキストで読み込むことを検討してください (「 Assembly.ReflectionOnlyLoad).

他のヒント

私は運動しました ケント・ブーガートの 2 番目のオプション。基本的に次のことを行う必要がありました。

1.) を実装します。 ResolveEventHandler 別のクラスで継承 MarshalByRefObject そして追加 Serializable 属性。

2.) 現在の値を追加します ApplicationBase, 、基本的にはイベント ハンドラーの DLL が存在する場所です。 AppDomain PrivateBinPath.

コードは次の場所にあります ギットハブ.

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top