Assembly クラスには、参照されたアセンブリを返す GetReferencedAssemblies メソッドがあります。参照されているタイプを見つける方法はありますか?
3 に答える
CLR は実行時に通知できません。resharper またはビジュアル スタジオによって行われる静的分析と同様に、ソース ファイルの深刻な静的分析を行う必要があります。
静的分析はかなり重要な作業です。基本的には、ac# パーサー、シンボル テーブル、および抽象構文ツリーで発生するすべてのケースを処理するための十分な時間が必要です。
CLR が実行時に通知できないのはなぜですか? ジャスト イン タイムでコンパイルされます。これは、CLR バイトコードが実行直前にマシン コードに変換されることを意味します。リフレクションは、型に関して実行時に静的に認識されていることのみを通知し、CLR は、コードの実行時に型が参照されているかどうかのみを認識します。CLR は、実行時 (ジャスト イン タイム コンパイルの時点) に型がロードされるタイミングのみを認識します。
タイプは、アセンブリとは別に参照されません。アセンブリが別のアセンブリを参照する場合、そのアセンブリ内のすべてのタイプも自動的に(少なくとも技術的なコンテキストでは)参照します。アセンブリで定義されている(参照されていない)すべてのタイプを取得するには、 Assembly.GetTypesメソッドを使用できます。
アセンブリをスキャンして、実際に参照するタイプ(つまり、実際に呼び出すタイプや言及するタイプ)をスキャンすることは可能かもしれませんが、かなり骨の折れる作業のように思えます。これには、おそらくILでの作業が含まれます。このようなことは避けるのが最善です。
編集: 実際、私がそれについて考えるとき、これはまったく不可能です。なんでも。非常に基本的なレベルです。重要なのは、型をインスタンス化して、意地悪に参照できるということです。これが起こることは珍しいことではありません。遅延バインディングは言うまでもありません。これはすべて、アセンブリが参照するすべてのタイプについてアセンブリを分析しようとすることは、将来を予測するようなものであることを意味します。
編集2:コメント
前述のように、あらゆる種類の動的参照のために質問を行うことはできませんが、差分エンコーディングを使用すると、あらゆる種類のバイナリファイルを大幅に縮小することができます。これにより、基本的に2つのバイナリファイルの違いを含むファイルを取得できます。実行可能ファイル/ライブラリの場合、実際のファイルよりもはるかに小さい傾向があります。この操作を実行するいくつかのアプリケーションを次に示します。bsdiffはWindowsでは実行されませんが、そこにポートへのリンクがあり、Googleを使用してさらに多くのポート(.NETを含む)を見つけることができることに注意してください。
見てみると、そのようなアプリケーションはもっとたくさんあります。最高の部分の1つは、完全に自己完結型であり、ユーザー側の作業がほとんど必要ないことです。