13

私は自分用にユーティリティを作成しています。これは、C# リフレクションを学習するための演習として、また、作成したツールを実際に自分で使用したいからです。

私が求めているのは、基本的にアプリケーションをアセンブリに向け、エクスポートされた 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 または実行中の実行可能ファイルのディレクトリにある場合、それらの名前で読み込むことができることは理解していますが、このユース ケースには当てはまらない可能性が高く、それが私の主なユース ケースです。

要するに、特定のアセンブリと、ファイル名で始まるすべての任意のアセンブリをロードして、型、プロパティ、メソッドなどの完全にリフレクションで参照可能なツリーを作成する方法です。

Reflector のようなツールがこれを行うことは知っていますが、それを取得するための構文が見つかりません。

4

2 に答える 2

13

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

  1. 要求されたアセンブリに基づいてAppDomain.AssemblyResolve別のものに取り付けて実行します。LoadFile
  2. ディレクトリをベースとして別のものを起動AppDomainし、その中にアセンブリをロードしAppDomainます。

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

于 2008-09-12T15:13:56.800 に答える
5

Kent Boogaartの 2 番目のオプションを考え出しました。基本的に私はしなければなりませんでした:

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

ApplicationBase2.)本質的にイベント ハンドラの dll が存在する現在の を に追加しAppDomain PrivateBinPathます。

コードはgithubにあります。

于 2016-05-05T21:54:53.340 に答える