如何检查DLL依赖性?


165

有时,当我做一个小项目时,我不够谨慎,并意外地添加了一个我不知道的DLL依赖项。当我将此程序发送给朋友或其他人时,“它不起作用”,因为缺少“某些DLL”。这当然是因为程序可以在我的系统上找到DLL,但不能在他们的系统上找到。

有没有扫描DLL依赖的可执行文件或在一个“干净”的DLL,自由的环境中执行的程序进行测试,以防止这些办法糟糕的情况呢?


2
调试器显示在“输出”窗口中加载的每个DLL。Debug + Windows + Modules显示它们的列表。确保您可以考虑所有这些因素。然后像测试代码一样测试安装程序,请使用VM。
汉斯·帕桑

@Hans Passant:我可以在某处找到标准Windows DLL的完整列表吗?
orlp 2011年

是的,在c:\ windows \ system32中拥有Microsoft版权。
汉斯·帕桑

2
@orlp-您也可以尝试dumpbin /dependents <program>。我猜该列表比列出%SYSTEM%或中的所有DLL更相关%SYSTEM32%。另请参阅MSDN上的DUMPBIN选项
jww

Answers:


103

尝试Dependency Walker(2006年的最新更新)或对其进行现代化改写,称为Dependencies


20
我读到这已经过时了,还有其他最新消息吗?
TankorSmash 2014年

6
如果可能的话,我将只信任原始的OS提供程序,因为ddl依赖关系应该是OS作业。任何Microsoft实用程序都可以做到这一点吗?命令行对我来说很好。
罗宾·许

3
@RobinHsu:Visual Studio 2005之前一直随Visual Studio一起提供DependencyWalker。Windows 驱动程序开发工具包中包含最新的版本(并且不能通过官方网站获得)。仍不是正式的Microsoft工具,而是Microsoft认可,推广和宣传的工具。
IInspectable '16


8
现在有一个开源重写部分用C#完成,满足“ Dependencies.exe ”:github.com/lucasg/Dependencies。测试印象:有点beta-ish,但显然可以处理API集SxS(Dependency Walker缺少)。
SteinÅsmul'Dec 14'17

215

dumpbin 从Visual Studio工具(VC \ bin文件夹)可以在这里提供帮助:

dumpbin /dependents your_dll_file.dll

7
方便的小工具,当您已经安装VS时,无需再安装任何新工具。
詹姆斯

13
是的,dumpbin.exe找出/dependents和非常有用/imports。如果link.exe与它一起复制并确保相应的x86 Visual C ++ Runtime Redistributable(msvcr120.dll适用于Visual Studio 2013),也可以在其他计算机上使用它。一些选项还具有其他依赖性。-顺便说一句,他们搞砸了选项名称,应该是,/PREREQUISITES而不是/DEPENDENTS,他们应该学习拉丁语。
Lumi 2015年

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 '19

45

我可以为Linux爱好者推荐有趣的解决方案。探索了此解决方案后,我从DependencyWalker切换到了该解决方案。

您可以使用自己喜欢ldd过Windows相关的exedll

为此,您需要在Windows上安装Cygwin(基本安装,不需要其他软件包),然后开始Cygwin Terminal。现在,您可以运行自己喜欢的Linux命令,包括:

$ ldd your_dll_file.dll

UPD:您也ldd可以通过Windows上的git bash终端使用。如果已经安装了git,则无需安装cygwin。


我只安装了cygwin,很高兴找到linux命令,但是我无法摆脱Cygwin根目录来访问本地驱动器(C :)上的其他文件。那是正常的吗?
ThomasGuenet '17

1
我认为这可以为您提供帮助:stackoverflow.com/questions/1850920/…–
troyane

4
不幸的是,有些依赖项无法通过这种方式找到:$ ldd ./Debug/helloworld.exe ??? => ??? (0x77d60000)。实用程序dumpbin正确显示所有依赖项。
fgiraldeau

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)
鲍里斯拉夫马尔可夫

1
作为已经安装了git bash的人,这是一个更好的解决方案。谢谢!
尼古拉斯

27
  1. 找出要使用的程序集的完整文件路径

  2. 按下开始按钮,输入“ dev”。启动名为“ VS 2017开发人员命令提示符”的程序

  3. 在打开的窗口中,输入dumpbin /dependents [path],这[path]是您在步骤1中找到的路径。

  4. 按回车键

Bam,您已经有了依赖项信息。该窗口应如下所示:

在此处输入图片说明

VS 2019更新: VS安装中需要此软件包:在此处输入图片说明


9
  1. 有一个名为“ Depends”的程序
  2. 如果您安装了cygwin,那么没有比ldd file.exe更简单的了

4
该工具称为Dependency Walker;它的可执行映像名为Depends.exe
IInspectable '16

7
Dependency Walker已过时。它的最后建造是在2008年!
SuB

depends不支持API集,因此对Win7 +毫无用处。
ivan_pozdeev,

8

最安全的是拥有一些干净的虚拟机,您可以在其上测试程序。在您要测试的每个版本上,将VM恢复到其初始清除值。然后使用其设置安装程序,然后查看其是否有效。

DLL问题有不同的面孔。如果使用Visual Studio并动态链接到CRT,则必须分发CRT DLL。更新您的VS,您必须分发另一版本的CRT。仅检查依赖项是不够的,因为您可能会错过这些依赖项。在干净的机器上进行完整安装是唯一安全的解决方案,IMO。

如果您不想设置一个完整的测试环境并拥有Windows 7,则可以使用XP-Mode作为初始的清洁机,并使用XP-More复制虚拟机。


6

在开发计算机上,您可以执行程序并运行Sysinternals Process Explorer。在下面的窗格中,它将显示已加载的DLL和它们的当前路径,由于多种原因,它们很方便。如果执行的是部署程序包,它将显示错误的路径中引用了哪些DLL(即未正确打包)。

当前,我们公司使用Visual Studio Installer项目来遍历依赖树并以松散文件形式输出程序。在VS2013中,现在是扩展名:https ://visualstudiogallery.msdn.microsoft.com/9abe329c-9bba-44a1-be59-0fbf6151054d 。然后,我们将这些松散的文件打包到一个更全面的安装程序中,但至少该安装程序会投影所有的点网依赖项,并将它们放到一个位置,并在缺少内容时发出警告。


2

在过去(即WinXP时代),我曾经依赖于/依赖于DLL Dependency Walker(depends.exe),但有时我仍然无法确定DLL问题。理想情况下,我们希望通过检查在运行时之前找出来,但是如果这样做不能解决问题(或花费太多时间),则可以尝试启用http://blogs.msdn.com/上所述的“加载程序捕捉” b / junfeng / archive / 2006/11/20 / debugging-loadlibrary-failures.aspxhttps://msdn.microsoft.com/zh-CN/library/windows/hardware/ff556886(v=vs.85).aspx并简要提到LoadLibrary失败;GetLastError没有帮助

警告:过去我用gflag弄乱Windows弄乱了它,使它爬行到膝盖,已经被警告了。

在此处输入图片说明

注意:“ Loader snap”是每个进程的,因此UI启用不会保持选中状态(使用cdb或glfags -i)


2

Jesse已经提到过NDepend(如果您分析.NET代码),但让我们确切地解释一下它可以如何提供帮助。

是否有一个程序/脚本可以扫描可执行文件中的DLL依赖关系,或者可以在“干净的”无DLL的环境中执行该程序以进行测试以防止出现这种情况?

在“ NDepend项目属性”面板中,您可以定义要分析的应用程序程序集(绿色),NDepend将推断应用程序使用的第三方程序集(蓝色)。提供了在其中搜索应用程序和第三方程序集的目录列表。

NDepend项目属性应用程序和第三方程序集

如果在这些目录中找不到第三方程序集,它将处于错误模式。例如,如果删除.NET Fx目录C:\WINDOWS\Microsoft.NET\Framework\v4.0.30319,则可以看到未解析.NET Fx第三方程序集:

NDepend项目属性应用程序和第三方程序集未解决

免责声明:我为NDepend工作


1

请在Google中搜索“ depends.exe”,这是一个处理此问题的小实用程序。


7
请注意,依赖行者已经过时,并且不能与64位很好地配合。它将明确显示所有依赖的DLL,这是OP所寻找的,但同时也增加了噪音-您会发现自己是32位可执行文件,缺少一些64位dll,依此类推...可悲的是,仍然没有更好的选择替代。
eran 2011年

@eran现在呢?现在有更好的选择吗?谢谢。
Nikos

@ RestlessC0bra我不知道,但是过去五年来我一直没有进行Windows开发。Dependency Walker肯定已经死了,Microsoft既不费心更新此有用的工具,也没有打开它的源代码,这样其他人就可以保持它的生命,这是一种耻辱。
eran

1
@eran没有DW没有死。显然,它仍然被广泛使用。还有其他一些工具,但是DW可能仍然是最好的。
Nikos

@ RestlessC0bra:依赖行者已死。它从来没有赶上64位模块。如果仔细看一看,Dependency Walker的大量使用会导致堆栈溢出问题,询问为什么会发生什么。不过,那从来没有发生过。这只是假的否定/肯定。Process Monitor应该是您的首选工具。
IInspectable

1

如果您有源代码,则可以使用ndepend。

http://www.ndepend.com/

它很昂贵,并且比分析依赖关系要多得多,因此对于您要查找的内容可能会显得过大。


3
作为专门为.NET量身定制的工具,它还可以分析本机映像的依赖性吗?
IInspectable '16

@IInspectable可能不是。我认为.NET没有办法做到这一点,除了可能使用P-Invoke。
kayleeFrye_onDeck

@kayleeFrye_onDeck:解析导入表归结为读取文件。.NET可以读取文件。
IInspectable

是的 但是,没有.NET API可以做到这一点:(您的建议是什么?我不是真正的.NET程序员,只是在较低级别的解决方案无法发布时使用它的人。有很多不错的检查工具可供选择在那里,但是很少有Windows是分布式友好的,更不用说快速了。。。我一直想用它来递归检查未知数量的二进制文件,以检测编译时使用的框架,因此我可以使用特殊的参数对它们进行处理, hoc。我可能不得不考虑使用LoadLibraryEx...
kayleeFrye_onDeck

1
@kayleeFrye_onDeck:Windows API中没有任何内容可以读取模块的导入表。您必须阅读文件并解析内容。本机代码和.NET之间没有区别。LoadLibraryEx在那里没有帮助。
IInspectable



By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.