如何检查DLL依赖?

orl*_*rlp 144 windows dll dependencies

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

是否有程序/脚本可以扫描可执行文件的DLL依赖项或在"干净的"无DLL环境中执行程序以进行测试以防止这些oops情况?

Jef*_*Son 187

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

dumpbin /dependents your_dll_file.dll
Run Code Online (Sandbox Code Playgroud)

  • 是的,`dumpbin.exe`对于弄清`/ dependents`和`/ imports`非常有用.如果你同时复制`link.exe`并确保相应的[x86 Visual C++运行时可再发行组件(Visual Studio 2013的`msvcr120.dll)](https://www.microsoft),你也可以在其他机器上使用它. .com/de-de/download/details.aspx?id = 40784)在目标机器上可用.某些选项具有其他依赖项. - 顺便说一句,他们搞砸了选项名称,应该是`/ PREREQUISITES`而不是`/ DEPENDENTS`,他们应该研究拉丁语. (11认同)
  • 方便的小工具,并且当您已安装VS时,可以节省安装任何新功能. (7认同)
  • @rkachach 如果您打开 Visual Studio 命令行(工具 -> Visual Studio 命令提示符),这将被识别为外部命令,您只需键入“dumpbin”。 (5认同)
  • 它太棒了,我们将这个添加到我们的构建系统中作为生成最终可执行文件时的验证步骤,因此我们不依赖于运输中未包含的内容. (2认同)
  • 唯一的缺点是此便捷工具非常隐蔽:c:\ Program Files(x86)\ Microsoft Visual Studio \ 2017 \ Community \ VC \ Tools \ MSVC \ 14.14.26428 \ bin \ Hostx64 \ x64> dumpbin (2认同)
  • 对于 VS2017 或 VS2019,这个答案非常有效,可以确保“dumpbin”在您的计算机上可用:/sf/answers/3549712771/ (2认同)
  • 嗯,这可能是因为tensorflow dll通过LoadLibrary加载这个cuda dll。无法检测到此类依赖性。 (2认同)
  • 对我来说它位于 C:\Program Files\Microsoft Visual Studio\2022\Community\SDK\ScopeCppSDK\vc15\VC\bin (2认同)

Luc*_*ore 85

尝试依赖walker:http://www.dependencywalker.com/

  • 我已经读到现在已经过时了,有什么更新的吗? (20认同)
  • 如果可能,我将只信任原始操作系统提供程序,因为ddl依赖项应该是OS作业.任何Microsoft实用程序都可以执行此操作吗?命令行对我来说没问题. (6认同)
  • `dumpbin`依赖于walker.https://msdn.microsoft.com/en-us/library/756as972.aspx | http://stackoverflow.com/a/28304716/3543437 (6认同)
  • @RobinHsu:DependencyWalker过去一直使用Visual Studio直到Visual Studio 2005. [Windows Driver Development Kit]中包含了最新版本(https://msdn.microsoft.com/en-US/windows/hardware/gg454513) (并未通过官方网站提供).仍然不是正式的微软工具,但微软批准,推广和宣传. (3认同)
  • 现在有一个开源重写部分在C#中完成,遇到"**Dependencies.exe**":https://github.com/lucasg/Dependencies.测试印象:**有点beta-ish**,但它显然处理**API集**和**SxS**(从Dependency Walker中丢失). (3认同)
  • 此外,您始终可以使用 Sysinternals 的 [**procmon.exe**](https://docs.microsoft.com/nb-no/sysinternals/downloads/procmon) 来调试高级依赖性问题(和其他问题)。[**有关如何为 procmon.exe 设置包含过滤器的答案,请参阅此答案**](/sf/answers/3345473211/) 因此输出是“可消化的”(在这种情况下用于调试 regsvr32。 exe 事件)。 (3认同)

tro*_*ane 41

我可以为Linux粉丝推荐有趣的解决方案.在我探索了这个解决方案之后,我已经从DependencyWalker切换到了这个.

您可以使用自己喜欢ldd过Windows相关的exe,dll.

要做到这一点,你需要在Windows上安装Cygwin(基本安装,不需要额外的软件包)然后启动Cygwin Terminal.现在您可以运行您喜欢的Linux命令,包括:

$ ldd your_dll_file.dll
Run Code Online (Sandbox Code Playgroud)

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

  • 我在Windows上使用ldd通过GIT BASH终端并且工作正常.所以如果你有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) (5认同)
  • 不幸的是,有些依赖不是通过这种方式找到的:`$ ldd ./Debug/helloworld.exe?=> ??? (0x77d60000)。实用程序dumpbin正确显示所有依赖项。 (2认同)

Gab*_*ers 23

尝试Dependency它被描述为“开源现代 Dependency Walker”。

\n

它有一个 GUI,但也可以通过命令行使用可选的 JSON 输出!

\n

要递归显示 mydll.dll 的依赖关系,深度可达 1:

\n
Dependencies.exe -chain mydll.dll -depth 1\n
Run Code Online (Sandbox Code Playgroud)\n

输出示例:

\n
  \xe2\x96\xa1 mydll.dll (ROOT) : C:/.../mydll.dll\n|  \xe2\x96\xa1 USER32.dll (WellKnownDlls) : C:\\WINDOWS\\SysWOW64\\user32.dll\n|  \xe2\x96\xa1 ADVAPI32.dll (WellKnownDlls) : C:\\WINDOWS\\SysWOW64\\advapi32.dll\n|  \xe2\x96\xa1 ole32.dll (WellKnownDlls) : C:\\WINDOWS\\SysWOW64\\ole32.dll\n|  \xe2\x96\xa1 GDI32.dll (WellKnownDlls) : C:\\WINDOWS\\SysWOW64\\gdi32.dll\n|  \xe2\x96\xa1 CRYPT32.dll (WellKnownDlls) : C:\\WINDOWS\\SysWOW64\\CRYPT32.dll\n|  \xe2\x96\xa1 Secur32.dll (WindowsFolder) : C:\\WINDOWS\\SysWOW64\\Secur32.dll\n|  \xe2\x96\xa1 MSVCP140D.dll (WindowsFolder) : C:\\WINDOWS\\SysWOW64\\MSVCP140D.dll\n|  \xe2\x96\xa1 USP10.dll (WindowsFolder) : C:\\WINDOWS\\SysWOW64\\USP10.dll\n|  \xe2\x96\xa1 KERNEL32.dll (WellKnownDlls) : C:\\WINDOWS\\SysWOW64\\kernel32.dll\n|  \xe2\x96\xa1 VCRUNTIME140D.dll (WindowsFolder) : C:\\WINDOWS\\SysWOW64\\VCRUNTIME140D.dll\n|  \xe2\x96\xa1 ucrtbased.dll (WindowsFolder) : C:\\WINDOWS\\SysWOW64\\ucrtbased.dll\n
Run Code Online (Sandbox Code Playgroud)\n

如果 DLL 丢失(在任何深度),则输出类似于:

\n
\xe2\x94\x9c mydll.dll (ROOT) : other.dll\n|  \xe2\x94\x9c other.dll (NOT_FOUND) :\n
Run Code Online (Sandbox Code Playgroud)\n

请注意,如果最大依赖深度很深,则可能需要很长时间才能生成结果。

\n


Iam*_*ool 17

  1. 按开始按钮,键入"dev".启动名为"VS 2017的开发人员命令提示"的程序

  2. 找出您尝试使用的程序集的完整文件路径

  3. 在打开的窗口中,键入dumpbin /dependents [path],[path]您在步骤2中找到的路径在哪里

  4. 按enter键

Bam,你有你的依赖信息.窗口应如下所示:

在此输入图像描述

这花了我整整一个小时才搞清楚.希望它能帮助将来的某些人.

  • “Bam”是你想要的,但我觉得 `dumpbin` 没有那么有用,因为它不是递归的。如果任何 DLL 依赖项又依赖于尚未在直接依赖项列表中的 DLL,那么您仍然会被搞砸。最好使用一个不半途而废的工具,例如“ldd”。 (6认同)

Art*_*yom 9

  1. 有一个名为"取决于"的程序
  2. 如果你安装了cygwin,那么没有什么比ldd file.exe更简单了

  • Dependency Walker已过时.它的最后一次建造是在2008年! (7认同)
  • 该工具称为*Dependency Walker*; 它的可执行映像名为*depends.exe*. (4认同)
  • `depends` 不支持 API 集,因此对于 Win7+ 没有用。 (2认同)

era*_*ran 8

最安全的是拥有一些干净的虚拟机,您可以在其上测试您的程序.在您要测试的每个版本上,将VM还原为其初始清洁值.然后使用其设置安装程序,看看它是否有效.

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

如果您不想设置完整的测试环境并使用Windows 7,则可以使用XP-Mode作为初始清理计算机,使用XP-More复制VM.


Shi*_*hiv 6

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

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


Pat*_*eam 5

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

是否有一个程序/脚本可以扫描可执行文件的 DLL 依赖项或在“干净”的无 DLL 环境中执行程序进行测试以防止这些 oops 情况?

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

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

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

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

免责声明:我为 NDepend 工作