.NETアプリケーションの依存関係を判断するにはどうすればよいですか?
-
03-07-2019 - |
質問
.NETアプリケーションの依存関係を判断するにはどうすればよいですか? Dependency Walker は管理対象アプリで動作しますか?最新版をダウンロードし、アプリのプロファイリングを試みましたが、あまり説明することなく終了します。 .NETで機能しない場合、ランタイムDLLの読み込みの問題をデバッグするのに役立つ他のツールはありますか?
解決
Dependency walkerは通常の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
ILDASMでアセンブリファイルを開き、マニフェストで.assembly externを検索します
.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 }
その結果は次のようになります:(コードメトリック depth に注意してください。1は直接の発信者、2は直接の発信者の発信者です...)( コールグラフ)
に結果を照会する依存関係グラフは次のようになります:
依存関係マトリックスは次のようになります。
依存関係マトリックスは、グラフよりも事実上の直感的ではありませんが、次のようなコードの複雑なセクションを閲覧するのに適しています:
免責事項:私はNDependで働いています
シェアウェアのアプリやツールをダウンロードしてインストールする必要はありません。 Assembly.GetReferencedAssemblies()
Assembly.LoadFile(@"app").GetReferencedAssemblies()
Monoツールチェーンを使用している場合、 < .NETアセンブリの依存関係を一覧表示する-assemblyref
引数を指定したcode> monodis ユーティリティこれは、 .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
フィードバック歓迎。
ChkAsmは、バージョンを含む特定のアセンブリのすべての依存関係を一度に表示し、リスト内のアセンブリを簡単に検索できるようにします。 この目的では、ILSpy( http://ilspy.net/ )よりもはるかにうまく機能します。このタスクのため。
私が使用しているもう1つの便利なReflectorアドインは、 Dependency Structure Matrix です。どのクラスが何を使用しているかを見るのは本当に素晴らしいことです。さらに無料です。
オプション-staticlink:&quot; Namespace.Assembly&quot;
を使用して.NETアセンブリをコンパイルしてみてください。これにより、コンパイラーはコンパイル時にすべての依存関係を強制的に取り込みます。参照されていない依存関係に遭遇すると、通常はそのアセンブリの名前とともに警告またはエラーメッセージが表示されます。
Namespace.Assembly
は、依存関係の問題があると思われるアセンブリです。通常、このアセンブリを静的にリンクするだけで、すべての依存関係が推移的に参照されます。
見たり使ったりするのに最適なアプリ、見逃した/問題のあるdllを表示: http://www.dependencywalker.com/