DLLの依存関係を確認する方法は?


165

時々、小さなプロジェクトをやっているとき、私は十分注意していなくて、知らないDLLの依存関係を誤って追加してしまいます。このプログラムを友人や他の人に出荷すると、「一部のDLL」が見つからないため、「動作しません」。これはもちろん、プログラムが私のシステムでDLLを見つけることができるからです。

DLLの依存関係の実行可能ファイルをスキャンする方法や、これらのoopsの状況を防ぐためにテストするために「クリーンな」DLLフリー環境でプログラムを実行する方法はありますか?


2
デバッガーは、出力ウィンドウに読み込まれるすべてのDLLを表示します。Debug + Windows + Modulesはそれらのリストを表示します。それらのすべてを説明できることを確認してください。コードをテストするようにインストーラーをテストし、VMを使用します。
ハンスパッサント2011

@Hans Passant:標準のWindows DLLの完全なリストはどこかにありますか?
orlp

そうです、c:\ windows \ system32にあり、マイクロソフトの著作権があります。
ハンスパッサント2011

2
@orlp-あなたも試すかもしれませんdumpbin /dependents <program>。このリストは、%SYSTEM%またはにすべてのDLLをリストするよりも関連があると思います%SYSTEM32%。MSDNのDUMPBINオプションも参照してください。
jww 2017年

回答:


103

Dependency Walker(2006年の最終更新)またはと呼ばれる最新の書き換えを試してくださいDependencies


20
これは現在日付が付けられていると読みましたが、もっと何か最新のものはありますか?
TankorSmash 2014年

6
可能であれば、ddl依存関係はOSジョブである必要があるため、元のOSプロバイダーのみを信頼します。Microsoftのユーティリティプログラムはこれを実行できますか?コマンドラインは私にとっては問題ありません。
Robin Hsu 2015年

3
@RobinHsu:DependencyWalkerはVisual Studio 2005までVisual Studioに同梱されていました。最新のビルドはWindows Driver Development Kitに含まれています(公式Webサイトからは入手できません)。まだ公式にはマイクロソフトのツールではありませんが、マイクロソフトによって認可、宣伝、宣伝されています。
IInspectable 2016年


8
C#で部分的に行われたオープンソースの書き換えがあります。「Dependencies.exe」:github.com/lucasg/Dependenciesを満たします。テストインプレッション:少しベータ風ですが、APIセットSxSを処理しているようです(Dependency Walkerにはありません)。
SteinÅsmul2017

215

dumpbin Visual Studioツール(VC \ binフォルダー)は、ここで役立ちます。

dumpbin /dependents your_dll_file.dll

7
便利な小さなツールで、すでにVSがインストールされている場合、新しいものをインストールする必要がなくなります。
ジェームズ

13
はい、およびdumpbin.exeを理解するのに非常に便利です。一緒にコピーし、対応するx86 Visual C ++ランタイム再頒布可能パッケージ(Visual Studio 2013用)がターゲットマシンで利用可能であることを確認すると、他のマシンでも使用できます。一部のオプションには追加の依存関係があります。-ちなみに、彼らはオプション名をめちゃくちゃにしました、それはラテン語を勉強するべきだったのではなく、むしろそうだったはずです。/dependents/importslink.exemsvcr120.dll/PREREQUISITES/DEPENDENTS
Lumi

2
すばらしいです。最終的な実行可能ファイルが生成されるときに、これを検証システムとしてビルドシステムに追加したので、出荷に含まれていないものに依存しません。
Lothar

4
唯一の欠点は、この便利なツールが非常に隠されていることです:c:\ Program Files(x86)\ Microsoft Visual Studio \ 2017 \ Community \ VC \ Tools \ MSVC \ 14.14.26428 \ bin \ Hostx64 \ x64> dumpbin
rkachach

1
@rkachach Visual Studioコマンドライン([ツール]-> [Visual Studioコマンドプロンプト])を開くと、これは外部コマンドとして認識され、「dumpbin」と入力するだけで済みます。
Bemipefe

45

Linuxファンには興味深いソリューションをお勧めします。このソリューションを調査した後、DependencyWalkerからこれに切り替えました。

あなたのお気に入りを使用することができますlddWindowsの関連の上exedll

これを行うには、Cygwinを Windowsにインストール(基本インストール、追加のパッケージは不要)して、を起動するだけCygwin Terminalです。これで、次のようなお気に入りのLinuxコマンドを実行できます。

$ ldd your_dll_file.dll

UPD:Windowsのgit bashターミナルlddからも使用できます。gitがすでにインストールされている場合は、cygwinをインストールする必要はありません。


cygwinをインストールするだけで、Linuxコマンドを見つけて満足しましたが、Cygwinルートから出て、ローカルドライブ(C :)上の他のファイルにアクセスできませんでした。それは正常ですか?
ThomasGuenet 2017

1
私は、これはあなたを助けることができると思う:stackoverflow.com/questions/1850920/...
troyane

4
残念ながら、この方法では見つからない依存関係がいくつかあります$ ldd ./Debug/helloworld.exe ??? => ??? (0x77d60000)。ユーティリティdumpbinはすべての依存関係を正しく表示します。
fgiraldeau 2018

5
私はWindowsのGIT BASHターミナルからlddを使用し、正常に動作します。したがって、gitがあれば簡単に、cygwinをインストールする必要はありません。例:borkox @ bobipc MINGW64〜$ ldd /c/Users/borkox/.javacpp/cache/openblas-0.3.0-1.4.2-windows-x86_64.jar/org/bytedeco/javacpp/windows-x86_64/jniopenblas_nolapack.dll ntdll.dll => /c/WINDOWS/SYSTEM32/ntdll.dll(0x7ffe46910000)KERNEL32.DLL => /c/WINDOWS/System32/KERNEL32.DLL(0x7ffe46610000)KERNELBASE.dll => / c / WINDOWS / System32 / KERNELBASE DLL(0x7ffe42d40000)MSVCRT.DLL => /c/WINDOWS/System32/msvcrt.dll(0x7ffe44120000)
Borislavマルコフ

1
すでにgit bashがインストールされている人にとって、これは望ましいソリューションでした。ありがとうございました!
ニコラ

28
  1. 処理しようとしているアセンブリへの完全なファイルパスを把握する

  2. スタートボタンを押し、「dev」と入力します。「VS 2017の開発者コマンドプロンプト」というプログラムを起動します。

  3. 開いたウィンドウで、と入力しますdumpbin /dependents [path][path]は、手順1で計算したパスです。

  4. Enterキーを押します

バム、あなたはあなたの依存関係情報を持っています。ウィンドウは次のようになります。

ここに画像の説明を入力してください

VS 2019の更新: VSインストールにこのパッケージが必要です:ここに画像の説明を入力してください


9
  1. 「Depends」というプログラムがあります
  2. cygwinがインストールされている場合、ldd file.exeよりも簡単なものはありません

4
このツールはDependency Walkerと呼ばれます。その実行可能イメージの名前はdepends.exeです。
IInspectable 2016年

7
ディペンデンシーウォーカーには日付があります。その最後の構築は2008年です!
SuB 2016年

dependsはAPIセットをサポートしていないため、Win7以降では使用できません。
ivan_pozdeev

8

最も安全なのは、プログラムをテストできるクリーンな仮想マシンを用意することです。テストするすべてのバージョンで、VMを初期のクリーンな値に復元します。次に、そのセットアップを使用してプログラムをインストールし、機能するかどうかを確認します。

Dllの問題にはさまざまな面があります。Visual Studioを使用してCRTに動的にリンクする場合は、CRT DLLを配布する必要があります。VSを更新すると、CRTの別のバージョンを配布する必要があります。依存関係を見逃す可能性があるため、依存関係をチェックするだけでは十分ではありません。クリーンマシンでフルインストールを行うことが、唯一の安全なソリューションであるIMOです。

本格的なテスト環境をセットアップせずにWindows 7を使用する場合は、XP-Modeを最初のクリーンマシンとして使用し、XP-Moreを使用してVMを複製できます。


6

開発マシンで、プログラムを実行してSysinternals Process Explorerを実行できます。下のペインには、読み込まれたDLLとそれらへの現在のパスが表示されます。これは、いくつかの理由で便利です。展開パッケージから実行している場合、間違ったパスで参照されている(つまり、正しくパッケージ化されていなかった)DLLが明らかになります。

現在、当社はVisual Studio Installerプロジェクトを使用して、依存関係ツリーをウォークし、プログラムを緩いファイルとして出力しています。VS2013では、これはhttps://visualstudiogallery.msdn.microsoft.com/9abe329c-9bba-44a1-be59-0fbf6151054dの拡張機能になりました。次に、これらの緩いファイルをより包括的なインストーラーにパッケージ化しますが、少なくともそのセットアップでは、すべてのドットネット依存関係をプロジェクト化し、それらを1つの場所にドロップし、不足している場合は警告します。


2

過去(WinXP日など)には、以前はDLL Dependency Walker(depends.exe)に依存/依存していましたが、それでもDLLの問題を特定できない場合があります。理想的には、実行前に検査で調べたいのですが、それでも解決しない場合(または時間がかかりすぎる場合)は、http://blogs.msdn.com/で説明されている「ローダースナップ」を有効にしてみてください。b / junfeng / archive / 2006/11/20 / debugging-loadlibrary-failures.aspxおよびhttps://msdn.microsoft.com/en-us/library/windows/hardware/ff556886(v=vs.85).aspx簡単に述べたLoadLibraryは失敗します。GetLastErrorヘルプなし

警告:私は過去にWindowsを台無しにしてgflagをだましてひざまずいてしまったことがありました。

ここに画像の説明を入力してください

注:「ローダースナップ」はプロセスごとなので、UIの有効化はチェックされたままになりません(cdbまたはglfags -iを使用)。


2

NDependはすでにJesseによって言及されています(.NETコードを分析する場合)が、それがどのように役立つかを正確に説明できます。

DLLの依存関係の実行可能ファイルをスキャンしたり、これらのoopsの状況を防止するためのテストのために「クリーンな」DLLフリー環境でプログラムを実行したりできるプログラム/スクリプトはありますか?

NDependプロジェクトのプロパティパネルでは、分析するアプリケーションアセンブリ(緑)を定義できます。NDependは、アプリケーションアセンブリ(青)で使用されるサードパーティアセンブリを推測します。アプリケーションおよびサードパーティアセンブリを検索するディレクトリのリストが提供されます。

NDependプロジェクトプロパティアプリケーションとサードパーティアセンブリ

これらのディレクトリにサードパーティのアセンブリが見つからない場合、エラーモードになります。たとえば、.NET Fxディレクトリを削除すると、C:\WINDOWS\Microsoft.NET\Framework\v4.0.30319.NET Fxサードパーティアセンブリが解決されないことがわかります。

NDependプロジェクトプロパティアプリケーションとサードパーティアセンブリが解決されない

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


1

グーグルで「depends.exe」を検索してください。これはこれを処理する小さなユーティリティです。


7
ディペンデンシーウォーカーはかなり時代遅れであり、64ビットとうまく連携しないことに注意してください。これは、OPが探しているすべての依存DLLを確実に表示しますが、ノイズも追加します。64ビットのDLLが欠けている32ビットの実行可能ファイルなどが見つかります...残念ながら、それ以上のことはありません代替。
eran

@eran今はどう?今より良い代替案はありますか?ありがとう。
ニコス2017

@ RestlessC0bra私が知っていることではありませんが、私は過去5年間Windows開発を行っていません。Dependency Walkerは確かに死んでいます。Microsoftがこの便利なツールを更新したり、ソースを開いたりして他の人が存続できるようにすることは残念なことです。
エラン20

1
@eranいいえ、DWは死んでいません。どうやら今でも広く使われているようです。他にもいくつかのツールがありますが、おそらくDWがおそらく最高です。
ニコス2017

@ RestlessC0bra:Dependency Walkerは死んでいます。64ビットモジュールに追いつくことはありません。よく見てみると、Dependency Walkerのその広範な使用の多くは、何かが起こっている理由を尋ねるStack Overflowの質問につながります。しかし、それは決して起こりません。それは単なる偽陰性/陽性です。プロセスモニターをお勧めします。
IInspectable 2017

1

ソースコードがある場合は、ndependを使用できます。

http://www.ndepend.com/

それは高価であり、依存関係の分析よりも多くのことを行うので、探しているものにとってはやり過ぎかもしれません。


3
.NET用に特別に調整されたツールであるため、ネイティブイメージの依存関係も分析されますか?
IInspectable 2016年

おそらくそうではありません、@ IInspectable。P-Invokeを使用する場合を除いて、.NETにはその方法はないと思います。
kayleeFrye_onDeck 2017

@kayleeFrye_onDeck:インポートテーブルを解析すると、ファイルを読み取ることになります。.NETはファイルを読み取ることができます。
IInspectable 2017

うん!それでも、これを行うための.NET APIはありません:(あなたは何を提案しますか?私は実際には.NETプログラマーではなく、低レベルのソリューションがうまくいかないときにそれを使用する人です。検査ツールの適切な選択がありますそこにありますが、Windowsの場合は非常に少数であり、配布に適しています。高速であることは言うまでもありません...不明な量のバイナリを再帰的に検査してコンパイル時に使用されるフレームワークを検出し、特別なパラメーターad- hoc。使用を検討する必要があるかもしれませんLoadLibraryEx...
kayleeFrye_onDeck 2017

1
@kayleeFrye_onDeck:Windows APIには、モジュールのインポートテーブルを読み取るものはありません。ファイルを読み取って内容を解析する必要があります。ネイティブコードと.NETの間に違いはありません。LoadLibraryExそこには役に立たない。
IInspectable 2017

0

pedepsプロジェクト(https://github.com/brechtsanders/pedeps)には、.exe(または.dll)ファイルとそれに依存するすべてのファイルをコピーするためのコマンドラインツール(copypedeps)があります。アプリケーションが動作するシステムでこれを行うと、依存関係のあるすべてのDLLとともに出荷できるはずです。



弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.