.NETアプリケーションの依存関係を確認するにはどうすればよいですか?


106

.NETアプリケーションの依存関係を確認するにはどうすればよいですか?DOES 依存関係ウォーカーの管理アプリケーションで動作しますか?私は最新のアプリをダウンロードしてプロファイリングを試みましたが、説明がなく終了します。.NETで動作しない場合、ランタイムDLLの読み込みの問題をデバッグするのに役立つ他のツールはありますか?

回答:


94

依存関係ウォーカーは通常のwin32バイナリで動作します。すべての.NET dllとexeには小さなスタブヘッダー部分があり、通常のバイナリのように見えますが、基本的には「CLRをロードする」というだけなので、依存関係のウォーカーが教えてくれます。

.NETアプリが実際に依存しているものを確認するには、Red Gateの非常に優れた.NETリフレクターを使用できます。(編集:.NET Reflectorは有料製品になりました。ILSpyは無料でオープンソースであり、非常によく似ています。)

DLLをロードして右クリックし、「分析」を選択すると、「依存」項目が表示され、必要な他のすべてのdll(およびそれらのdll内のメソッド)が表示されます。

ただし、アプリがX dllに依存し、X dllが存在するという点で、トリッキーになる場合がありますが、なんらかの理由で実行時にロードまたは配置できません。

これらの種類の問題をトラブルシューティングするために、Microsoftには、実行時に何が起こっているかを示すことができるアセンブリバインディングログビューアーがあります。


私はあなたがそのURLの少しを逃したと思います-.aspxはリンクテキストに入れられました。私はそれをなんとか見つけました。
ブライアン・スチュワート、

ああ...そうです、マークダウンコントロールはURLの角かっこを使用しますが、残念なことに、MSDNはそのすべてのURLに(VS80)を入れます:-(
Orion Edwards

44
2011年初頭から、.NET Reflectorは無料ではなくなりました。オープンソースのILSpyプロジェクトは非常に似ています。
ヨーヨー

1
アセンブリバインディングログビューv4.0.30319.1はまったく使用できません。ログエントリは発生順に表示されず、並べ替えることもできません。ビューアに適合しないパスが表示され、サイズを変更することはできません。時間の無駄です。
ニュートリノ2013

dependencywalker.com言及するもののURLを含める必要があります。彼らが働く場合。
toddmo 2013年

54

小さなユーティリティAsmSpyは、アセンブリの読み込みに関する問題を解決するための非常に貴重なツールです。アセンブリバージョンを含むマネージアセンブリのすべてのアセンブリ参照が一覧表示されます。

のディレクトリのコマンドプロンプトで.dll次の引数を指定して実行します。

asmspy . all

asmspy出力のスクリーンショット

Chocolateyを使用してすばやくインストールします。

choco install asmspy

C#ファイルやRazorビューでも機能しますか?実行時にmvcプロジェクトからいくつかのビューとコントローラーをエクスポートして、サブプロジェクトを作成しています。また、これらのビューとコントローラーに必要な依存関係を知りたいので、実行時にこれらの依存関係をコピーして、サブプロジェクトをIIS上の別のWebプロジェクトとして公開できるようにします。
Rupendra 2017年

25

ILDASMでアセンブリファイルを開き、マニフェストで.assembly externを確認します。


1
この方法でも依存アセンブリのバージョンを確認できますか?依存関係の名前だけが表示され、バージョンも表示されません。
マイケルR

実際、そうです。「マニフェスT」をクリックすると、依存アセンブリのバージョンもこのように表示されます
Michael R

1
私はこれを好みます
Dan Field

サードパーティのアプリのクラッシュをデバッグするときに、ildasmのみをインストールする方法は?
realtebo

18

.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は直接の呼び出し元の呼び出し元の場合です...)(クエリの結果をコールグラフにエクスポートする[グラフにエクスポート]ボタンにも注意してください)。

C#LINQクエリを参照するNDepend依存関係

ディペンデンシーグラフは次のようになります。

NDependディペンデンシーグラフ

依存行列は次のようになります。

NDepend依存関係マトリックス

依存関係マトリックスは事実上、グラフよりも直感的ではありませんが、次のようなコードの複雑なセクションを参照するのに適しています。

NDependマトリックスvsグラフ

免責事項:私はNDependで働いています


2
パトリックはおそらく、彼がその素晴らしいツールの作者だと言ったはずです;)。ぜひチェックしてみてください。それを書くための+1!
ミッチウィート

1
ねえ、私はこれに自分で気づきました。私は彼のブログ投稿を読んで楽しんでいます-私はNDependを試さなければなりません!
ブライアンスチュワート

2
@MitchWheat-名前はハハ、「NDependチームのパトリック」をチェックアウト
kayleeFrye_onDeck 2017

VStudioで使用できますか?私のPCではなくサードパーティのアプリのクラッシュをデバッグするには
realtebo

16

シェアウェアのアプリやツールをダウンロードしてインストールする必要はありません。あなたは.NETからプログラムを使用してそれを行うことができますAssembly.GetReferencedAssemblies()

Assembly.LoadFile(@"app").GetReferencedAssemblies()

9
デバッグの目的では、PowerShellを使用してこれを行うとより便利です[Reflection.Assembly]::LoadFile('C:\absolute\path\to\my.dll').GetReferencedAssemblies()。ツールのためのあいまいなWindowsの場所をダウンロードまたはハンティングしないという素晴らしい利点があります。+1
jpmc26

3
イム間違っている場合は、正しい私が、これは単に不足している依存関係を持つアプリケーションがそう非常に有用ではありません与えることをあなたに同じエラーを与えるだろう
JK。

これは、アセンブリがAppDomainに読み込まれたときにのみ機能します。リフレクション用に読み込まれたアセンブリは、nullセットを返します。
デビッドA.グレイ

7

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

5

アセンブリバインディングログを有効にして、HKLM \ Software \ Microsoft \ Fusionのレジストリ値EnableLogを1に設定します。変更を有効にするには、アプリケーションを再起動する必要があります(iisresetを使用)。

ヒント:フュージョンログをオンにするとパフォーマンスが低下するため、完了したら必ずオフにしてください。


5

おかしいのは、同じような問題があり、適切なものが見つからず、古き良きDependency Walkerを知っていたので、結局自分で書きました。

これは特に.NETを扱い、アセンブリが参照している(および欠落している)参照を再帰的に示します。また、ネイティブライブラリの依存関係も表示されます。

これは無料(個人用)で、興味のある方はこちらから入手できます。www.netdepends.com

www.netdepends.com

フィードバックを歓迎します。


アセンブリを開くためのドラッグアンドドロップサポートを追加してください。XCOPYの展開とソースコードが利用可能であるとよいでしょう。
ギガプレックス

私は、ウェブサイトに2つのエディションがあるセクションへの明確なリンクがなく、無料のものは非商用目的で使用していることに気づきました。[ヘルプ]メニューの[プロフェッショナルにアップグレード]オプションを見つけて、偶然これに遭遇しました。ダウンロードページに、商用利用は無料ではないという通知が表示されます。
ギガプレックス

@gigaplex私はこれらの感謝の両方に注意します、私は何ができるか見ていきます。
ロイド

1
Shiftclickでツリーを開くと、すべてのサブアイテムも同様に役立ちます。
TS

1
不足している依存関係をどのように通知しますか?
realtebo

2

http://www.amberfish.net/

ChkAsmは、バージョンを含む特定のアセンブリのすべての依存関係を一度に表示し、リスト内のアセンブリを簡単に検索できるようにします。この目的で使用したILSpy(http://ilspy.net/)よりもはるかに優れています。


1
2019年現在、そのサイトはある種の
大ざっぱな

@ McGuireV10そうですね。それは残念です。そして、簡単なグーグルはそのアプリのヒットをもう起こさない。
mhenry1384

0

私が使用するもう1つの便利なReflectorアドインは、依存構造マトリックスです。どのクラスが何を使用するかを見るのは本当に素晴らしいことです。さらに無料です。


バージョン番号は表示されませんが、残念ながら、少なくともVisual Studioアドインとしてインストールされるバージョンは表示されません。
mhenry1384

0

オプションを使用して.NETアセンブリをコンパイルしてみてください--staticlink:"Namespace.Assembly"。これにより、コンパイラーはコンパイル時にすべての依存関係を強制的に取り込みます。参照されていない依存関係に遭遇した場合、通常はそのアセンブリの名前を含む警告またはエラーメッセージが表示されます。

Namespace.Assembly依存関係の問題があると疑われるアセンブリです。通常、このアセンブリを静的にリンクするだけで、すべての依存関係が推移的に参照されます。


-4

私が見たり使用したりして見逃した/問題のあるdllを表示する最高のアプリ:http ://www.dependencywalker.com/


2
このツールは.NETアセンブリには役立ちません。
Kevin Panko
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.