.NETアプリケーションの依存関係を確認するにはどうすればよいですか?Dependency Walkerはマネージドアプリで動作しますか?最新のものをダウンロードしてアプリのプロファイリングを試みましたが、説明がほとんどなく終了します。.NETで動作しない場合、ランタイムDLLの読み込みの問題をデバッグするのに役立つ他のツールはありますか?
14 に答える
Dependency Walker は通常の win32 バイナリで動作します。すべての .NET dll および exe には小さなスタブ ヘッダー部分があり、通常のバイナリのように見えますが、基本的には「CLR をロードする」だけです。
.NET アプリが実際に依存しているものを確認するには、Red Gateの非常に優れた.NET リフレクターを使用できます。(編集: .NET Reflector は現在有料製品であることに注意してください。ILSpyは無料でオープン ソースであり、非常によく似ています。)
DLL をロードし、右クリックして [分析] を選択すると、必要な他のすべての DLL (およびそれらの DLL 内のメソッド) を表示する [依存先] 項目が表示されます。
ただし、アプリが X dll に依存しており、X dll が存在するにもかかわらず、何らかの理由で実行時にロードまたは配置できないという点で、より複雑になることがあります。
このような問題のトラブルシューティングを行うために、Microsoft には、実行時に何が起こっているかを表示できるAssembly Binding Log Viewerがあります。
小さなユーティリティAsmSpyは、アセンブリの読み込みに関する問題を解決するための非常に貴重なツールだと思います。アセンブリ バージョンを含む、マネージド アセンブリのすべてのアセンブリ参照が一覧表示されます。
のディレクトリにあるコマンド プロンプトで.dll
、次の引数を使用して実行します。
asmspy . all
Chocolatey を使用してすばやくインストールします。
choco install asmspy
ILDASMでアセンブリファイルを開き、MANIFESTで.assemblyexternを確認します。
シェアウェア アプリやツールをダウンロードしてインストールする必要はありません。を使用して.NETからプログラムで実行できますAssembly.GetReferencedAssemblies()
Assembly.LoadFile(@"app").GetReferencedAssemblies()
.NET コードの依存関係を参照するには、ツール NDepend の機能を使用できます。このツールは次のことを提案します。
- 依存関係グラフ
- 依存関係マトリックス
- また、一部のC# LINQ クエリを編集 (または生成) して、依存関係を参照することもできます。
たとえば、そのようなクエリは次のようになります。
from m in Methods
let depth = m.DepthOfIsUsing("NHibernate.NHibernateUtil.Entity(Type)")
where depth >= 0 && m.IsUsing("System.IDisposable")
orderby depth
select new { m, depth }
その結果は次のようになります: (コード メトリックの深さに注意してください。1 は直接の呼び出し元、2 は直接の呼び出し元の呼び出し元です...) (クエリ結果をCall Graphにエクスポートするための [グラフにエクスポート] ボタンにも注意してください)
依存関係グラフは次のようになります。
依存関係マトリックスは次のようになります。
依存関係マトリックスは、事実上、グラフよりも直感的ではありませんが、次のようなコードの複雑なセクションを参照するのにより適しています。
免責事項:私はNDependで働いています
Mono ツールチェーンを使用している場合は、monodis
ユーティリティを--assemblyref
引数とともに使用して、.NET アセンブリの依存関係を一覧表示できます。これはファイル.exe
と.dll
ファイルの両方で機能します。
使用例:
monodis --assemblyref somefile.exe
出力例 (.exe):
$ monodis --assemblyref monop.exe
AssemblyRef Table
1: Version=4.0.0.0
Name=System
Flags=0x00000000
Public Key:
0x00000000: B7 7A 5C 56 19 34 E0 89
2: Version=4.0.0.0
Name=mscorlib
Flags=0x00000000
Public Key:
0x00000000: B7 7A 5C 56 19 34 E0 89
出力例 (.dll):
$ monodis --assemblyref Mono.CSharp.dll
AssemblyRef Table
1: Version=4.0.0.0
Name=mscorlib
Flags=0x00000000
Public Key:
0x00000000: B7 7A 5C 56 19 34 E0 89
2: Version=4.0.0.0
Name=System.Core
Flags=0x00000000
Public Key:
0x00000000: B7 7A 5C 56 19 34 E0 89
3: Version=4.0.0.0
Name=System
Flags=0x00000000
Public Key:
0x00000000: B7 7A 5C 56 19 34 E0 89
4: Version=4.0.0.0
Name=System.Xml
Flags=0x00000000
Public Key:
0x00000000: B7 7A 5C 56 19 34 E0 89
アセンブリバインディングログを有効にすると、HKLM \ Software \ Microsoft \ Fusionのレジストリ値EnableLogが1に設定されます。変更を有効にするには、アプリケーションを再起動する(iisresetを使用する)必要があることに注意してください。
ヒント:フュージョンログをオンにするとパフォーマンスが低下するため、完了したらフュージョンログをオフにすることを忘れないでください。
同様の問題があり、適切なものが見つからず、古き良き Dependency Walker を認識していたので、最終的に自分で書きました。
これは特に .NET を扱い、アセンブリに含まれる (および欠落している) 参照を再帰的に表示します。また、ネイティブ ライブラリの依存関係も表示されます。
これは無料で (個人使用の場合)、興味のある方はこちらから入手できます: www.netdepends.com
フィードバック歓迎。
私が使用するもう 1 つの便利な Reflector アドインは、Dependency Structure Matrixです。どのクラスが何を使用しているかを見るのは本当に素晴らしいことです。さらに、無料です。
私が見て使っている最高のアプリ、見逃した/問題のあるdllを表示します: http://www.dependencywalker.com/