如何检查DLL依赖?

有时当我正在做一个小项目时,我不够小心,意外地为我不知道的DLL添加依赖项。 当我把这个程序发送给朋友或其他人“它不工作”,因为“一些DLL”丢失。 这是当然的,因为程序可以在我的系统上findDLL,而不是他们的。

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

尝试依赖沃克: http : //www.dependencywalker.com/

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

 dumpbin /dependents your_dll_file.dll 

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

你可以使用你最喜欢的ldd在Windows相关的exedll

为此,您需要在Windows上安装Cygwin (基本安装,不需要额外的软件包),然后启动Cygwin Terminal 。 现在你可以运行你最喜欢的Linux命令,包括:

 $ ldd your_dll_file.dll 
  1. 有一个名为“取决于”的程序
  2. 如果你已经安装了cygwin,没有什么简单的ldd file.exe

最安全的是有一些干净的虚拟机,你可以testing你的程序。 在您要testing的每个版本上,将VM恢复到其初始清理值。 然后使用它的安装程序来安装你的程序,看看它是否有效。

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

如果你不想build立一个全面的testing环境并且拥有Windows 7,那么你可以使用XP-Mode作为初始清理机器,而使用XP-More来复制VM。

在您的开发机器上,您可以执行该程序并运行Sysinternals Process Explorer 。 在下面的窗格中,它将向您显示加载的DLL和当前path,由于多种原因,这些path非常方便。 如果正在执行部署包,则会显示哪些DLL在错误path中被引用(即没有正确打包)。

目前,我们公司使用Visual Studio Installer项目来执行依赖关系树和输出作为松散文件的程序。 在VS2013中,这是一个扩展: https ://visualstudiogallery.msdn.microsoft.com/9abe329c-9bba-44a1-be59-0fbf6151054d。 然后,我们将这些松散的文件打包成一个更全面的安装程序,但是至less该安装程序投影了所有的networking依赖关系,并将它们放到一个位置,并在缺less事物时提醒您。

在过去(即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没有帮助

警告:我已经搞乱了我的窗口过去鬼混,使它爬到膝盖,你已经预先警告。

在这里输入图像描述

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

请在google中search“depends.exe”,这是一个很小的工具来处理这个问题。

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

http://www.ndepend.com/

这是昂贵的,比分析依赖关系还要多,所以对于你所寻找的东西来说可能是过度的。

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

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

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

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

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

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

免责声明:我为NDepend工作