.NETアプリケーションの依存関係を確認するにはどうすればよいですか?DOES 依存関係ウォーカーの管理アプリケーションで動作しますか?私は最新のアプリをダウンロードしてプロファイリングを試みましたが、説明がなく終了します。.NETで動作しない場合、ランタイムDLLの読み込みの問題をデバッグするのに役立つ他のツールはありますか?
.NETアプリケーションの依存関係を確認するにはどうすればよいですか?DOES 依存関係ウォーカーの管理アプリケーションで動作しますか?私は最新のアプリをダウンロードしてプロファイリングを試みましたが、説明がなく終了します。.NETで動作しない場合、ランタイムDLLの読み込みの問題をデバッグするのに役立つ他のツールはありますか?
回答:
依存関係ウォーカーは通常のwin32バイナリで動作します。すべての.NET dllとexeには小さなスタブヘッダー部分があり、通常のバイナリのように見えますが、基本的には「CLRをロードする」というだけなので、依存関係のウォーカーが教えてくれます。
.NETアプリが実際に依存しているものを確認するには、Red Gateの非常に優れた.NETリフレクターを使用できます。(編集:.NET Reflectorは有料製品になりました。ILSpyは無料でオープンソースであり、非常によく似ています。)
DLLをロードして右クリックし、「分析」を選択すると、「依存」項目が表示され、必要な他のすべてのdll(およびそれらのdll内のメソッド)が表示されます。
ただし、アプリがX dllに依存し、X dllが存在するという点で、トリッキーになる場合がありますが、なんらかの理由で実行時にロードまたは配置できません。
これらの種類の問題をトラブルシューティングするために、Microsoftには、実行時に何が起こっているかを示すことができるアセンブリバインディングログビューアーがあります。
小さなユーティリティAsmSpyは、アセンブリの読み込みに関する問題を解決するための非常に貴重なツールです。アセンブリバージョンを含むマネージアセンブリのすべてのアセンブリ参照が一覧表示されます。
のディレクトリのコマンドプロンプトで.dll
次の引数を指定して実行します。
asmspy . all
Chocolateyを使用してすばやくインストールします。
choco install asmspy
.NETコードの依存関係を参照するには、ツールNDependの機能を使用できます。ツールは提案します:
たとえば、そのようなクエリは次のようになります。
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は直接の呼び出し元の呼び出し元の場合です...)(クエリの結果をコールグラフにエクスポートする[グラフにエクスポート]ボタンにも注意してください)。
ディペンデンシーグラフは次のようになります。
依存行列は次のようになります。
依存関係マトリックスは事実上、グラフよりも直感的ではありませんが、次のようなコードの複雑なセクションを参照するのに適しています。
免責事項:私はNDependで働いています
シェアウェアのアプリやツールをダウンロードしてインストールする必要はありません。あなたは.NETからプログラムを使用してそれを行うことができますAssembly.GetReferencedAssemblies()
Assembly.LoadFile(@"app").GetReferencedAssemblies()
[Reflection.Assembly]::LoadFile('C:\absolute\path\to\my.dll').GetReferencedAssemblies()
。ツールのためのあいまいなWindowsの場所をダウンロードまたはハンティングしないという素晴らしい利点があります。+1
Monoツールチェーンを使用しているmonodis
場合は、ユーティリティを--assemblyref
引数とともに使用して、.NETアセンブリの依存関係を一覧表示できます。これは.exe
と.dll
ファイルの両方で機能します。
monodis --assemblyref somefile.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
$ 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
おかしいのは、同じような問題があり、適切なものが見つからず、古き良きDependency Walkerを知っていたので、結局自分で書きました。
これは特に.NETを扱い、アセンブリが参照している(および欠落している)参照を再帰的に示します。また、ネイティブライブラリの依存関係も表示されます。
これは無料(個人用)で、興味のある方はこちらから入手できます。www.netdepends.com
フィードバックを歓迎します。
ChkAsmは、バージョンを含む特定のアセンブリのすべての依存関係を一度に表示し、リスト内のアセンブリを簡単に検索できるようにします。この目的で使用したILSpy(http://ilspy.net/)よりもはるかに優れています。
私が使用するもう1つの便利なReflectorアドインは、依存構造マトリックスです。どのクラスが何を使用するかを見るのは本当に素晴らしいことです。さらに無料です。
オプションを使用して.NETアセンブリをコンパイルしてみてください--staticlink:"Namespace.Assembly"
。これにより、コンパイラーはコンパイル時にすべての依存関係を強制的に取り込みます。参照されていない依存関係に遭遇した場合、通常はそのアセンブリの名前を含む警告またはエラーメッセージが表示されます。
Namespace.Assembly
依存関係の問題があると疑われるアセンブリです。通常、このアセンブリを静的にリンクするだけで、すべての依存関係が推移的に参照されます。
私が見たり使用したりして見逃した/問題のあるdllを表示する最高のアプリ:http ://www.dependencywalker.com/