2

を使用して、dll 内のすべての参照を特定しようとしていSystem.Reflectionます。ただし、GetReferencedAssemblies「参照」にあるもののみを一覧表示します (ソリューション エクスプローラーに表示されます)。

importsステートメントなど、コード自体から参照を判別したいと考えています。if/then ステートメント、try/catch、絶対にすべてのようなものです。

これを使用して行うことは可能System.Reflectionですか? もしそうなら、どのように?

私は間違いなく p/invoke なしでこれを行うことを好みます。

助けてくれてありがとう!

これはvb.netにあります。

4

3 に答える 3

3

NDependが必要なようです。

(大きなタスクであるアプリを分析するためのツールを作成している場合)

于 2010-03-04T03:35:43.897 に答える
2

編集

後のコメントで説明されているように、コードが直接使用するアセンブリのみが必要です。

GetReferencedAssemblies それをします。


コメントで説明されているように、停止の問題を解決しようとしています。

これは、元のアセンブリを実際に実行する (およびプロファイリング API を使用してアセンブリが使用する型を確認する) ことなく、確実に行うことはできません。


各参照を再帰的に呼び出しGetReferencedAssembliesて、間接的な依存関係のツリー全体を取得できます。

編集

例えば:

static IEnumerable<Assembly> (Assembly a) {
    return a.GetReferencedAssemblies()
            .Concat(a.GetReferencedAssemblies()
                     .SelectMany<Assembly, Assembly>(GetAllReferences)
            );

ただし、いずれかの参照で、元のアセンブリから到達できないコード パス内のアセンブリが使用されている場合、誤検知が発生する可能性があります。インターフェイスとポリモーフィズムが原因で、このような誤検知を取り除くことは非常に困難な場合があります。到達可能なコード パス内のいずれかのコードがリフレクションを使用している場合、それは定義上不可能です。

于 2010-03-04T03:47:03.840 に答える
1

名前空間名とアセンブリ名を混同しています。System.IO は名前空間です。実際には複数のアセンブリに表示されます。System.IO.File クラスは mscorlib.dll にあり、System.IO.FileSystemWatcher は system.dll にあり、System.IO.Pipes.PipeStream は system.core.dll にあります。

GetReferencedAssemblies は正確です。

このコードを書く前に、Red Gate の Reflectorをいじってみてください。

于 2010-03-04T04:54:13.553 に答える