如何检查DLL依赖?

问题描述 投票:129回答:12

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

有没有办法扫描可执行文件的DLL依赖项或在“干净的”无DLL环境中执行程序进行测试,以防止这些oops情况?

windows dll dependencies
12个回答
81
投票

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


1
投票

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

http://blogs.msdn.com/b/junfeng/archive/2006/11/20/debugging-loadlibrary-failures.aspx

它价格昂贵,并且比分析依赖关系做得更多,因此对于您正在寻找的内容可能过度。


1
投票

Jesse已经提到过NDepend(如果你分析.NET代码),但我们可以准确地解释它是如何帮助的。

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

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

https://msdn.microsoft.com/en-us/library/windows/hardware/ff556886(v=vs.85).aspx

如果在这些目录中找不到第三方程序集,则它将处于错误模式。例如,如果我删除.NET Fx目录LoadLibrary fails; GetLastError no help,我可以看到.NET Fx第三方程序集未解析:

http://www.ndepend.com/

免责声明:我为NDepend工作


-1
投票

pedeps项目(NDepend Project Properties Application and Third-Party assemblies)有一个命令行工具(copypedeps),用于复制.exe(或.dll)文件及其依赖的所有文件。如果在应用程序运行的系统上执行此操作,则应该能够将其与所有依赖DLL一起发送。


171
投票

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

dumpbin /dependents your_dll_file.dll

36
投票

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

你可以使用你最喜欢的qazxsw poi而不是与Windows相关的qazxsw poi,qazxsw poi。

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

dll

UPD:您也可以通过Cygwin使用Cygwin Terminal。如果你已经安装了git,则无需安装cygwin。


12
投票
  1. 按开始按钮,键入“dev”。启动名为“VS 2017的开发人员命令提示”的程序
  2. 找出您尝试使用的程序集的完整文件路径
  3. 在打开的窗口中,键入$ ldd your_dll_file.dll ,其中ldd是您在步骤2中找到的路径
  4. 按enter键

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

git bash terminal on Windows


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

8
投票

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

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

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


6
投票

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

目前,我们公司使用Visual Studio Installer项目来遍历依赖树并输出作为松散文件的程序。在VS2013中,现在这是一个扩展:enter image description here。然后我们将这些松散的文件打包到一个更全面的安装程序中,但至少该设置项目会将所有点网依赖项放到一个位置并将它们放入一个位置,并在缺少任何内容时发出警告。


2
投票

在过去(即WinXP日),我曾经依赖/依赖DLL Dependency Walker(depends.exe),但有时候我仍然无法确定DLL问题。理想情况下,我们希望在运行之前通过检查发现,但如果不解决它(或花费太多时间),您可以尝试启用XP-MoreSysinternals Process Explorer上描述的“加载器快照”并简要提及https://visualstudiogallery.msdn.microsoft.com/9abe329c-9bba-44a1-be59-0fbf6151054d

警告:我过去搞砸了我的Windows,因为gflag让它匍匐前行,你已经被预先警告了。

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


1
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.