有时,当我做一个小项目时,我不够谨慎,并意外地添加了一个我不知道的DLL依赖项。当我将此程序发送给朋友或其他人时,“它不起作用”,因为缺少“某些DLL”。这当然是因为程序可以在我的系统上找到DLL,但不能在他们的系统上找到。
有没有扫描DLL依赖的可执行文件或在一个“干净”的DLL,自由的环境中执行的程序进行测试,以防止这些办法糟糕的情况呢?
有时,当我做一个小项目时,我不够谨慎,并意外地添加了一个我不知道的DLL依赖项。当我将此程序发送给朋友或其他人时,“它不起作用”,因为缺少“某些DLL”。这当然是因为程序可以在我的系统上找到DLL,但不能在他们的系统上找到。
有没有扫描DLL依赖的可执行文件或在一个“干净”的DLL,自由的环境中执行的程序进行测试,以防止这些办法糟糕的情况呢?
Answers:
尝试Dependency Walker
(2006年的最新更新)或对其进行现代化改写,称为Dependencies
。
dumpbin
从Visual Studio工具(VC \ bin文件夹)可以在这里提供帮助:
dumpbin /dependents your_dll_file.dll
dumpbin.exe
找出/dependents
和非常有用/imports
。如果link.exe
与它一起复制并确保相应的x86 Visual C ++ Runtime Redistributable(msvcr120.dll
适用于Visual Studio 2013),也可以在其他计算机上使用它。一些选项还具有其他依赖性。-顺便说一句,他们搞砸了选项名称,应该是,/PREREQUISITES
而不是/DEPENDENTS
,他们应该学习拉丁语。
我可以为Linux爱好者推荐有趣的解决方案。探索了此解决方案后,我从DependencyWalker切换到了该解决方案。
您可以使用自己喜欢ldd
过Windows相关的exe
,dll
。
为此,您需要在Windows上安装Cygwin(基本安装,不需要其他软件包),然后开始Cygwin Terminal
。现在,您可以运行自己喜欢的Linux命令,包括:
$ ldd your_dll_file.dll
UPD:您也ldd
可以通过Windows上的git bash终端使用。如果已经安装了git,则无需安装cygwin。
$ ldd ./Debug/helloworld.exe ??? => ??? (0x77d60000)
。实用程序dumpbin正确显示所有依赖项。
depends
不支持API集,因此对Win7 +毫无用处。
在开发计算机上,您可以执行程序并运行Sysinternals Process Explorer。在下面的窗格中,它将显示已加载的DLL和它们的当前路径,由于多种原因,它们很方便。如果执行的是部署程序包,它将显示错误的路径中引用了哪些DLL(即未正确打包)。
当前,我们公司使用Visual Studio Installer项目来遍历依赖树并以松散文件形式输出程序。在VS2013中,现在是扩展名:https ://visualstudiogallery.msdn.microsoft.com/9abe329c-9bba-44a1-be59-0fbf6151054d 。然后,我们将这些松散的文件打包到一个更全面的安装程序中,但至少该安装程序会投影所有的点网依赖项,并将它们放到一个位置,并在缺少内容时发出警告。
在过去(即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/zh-CN/library/windows/hardware/ff556886(v=vs.85).aspx并简要提到LoadLibrary失败;GetLastError没有帮助
警告:过去我用gflag弄乱Windows弄乱了它,使它爬行到膝盖,已经被警告了。
注意:“ Loader snap”是每个进程的,因此UI启用不会保持选中状态(使用cdb或glfags -i)
Jesse已经提到过NDepend(如果您分析.NET代码),但让我们确切地解释一下它可以如何提供帮助。
是否有一个程序/脚本可以扫描可执行文件中的DLL依赖关系,或者可以在“干净的”无DLL的环境中执行该程序以进行测试以防止出现这种情况?
在“ NDepend项目属性”面板中,您可以定义要分析的应用程序程序集(绿色),NDepend将推断应用程序使用的第三方程序集(蓝色)。提供了在其中搜索应用程序和第三方程序集的目录列表。
如果在这些目录中找不到第三方程序集,它将处于错误模式。例如,如果删除.NET Fx目录C:\WINDOWS\Microsoft.NET\Framework\v4.0.30319
,则可以看到未解析.NET Fx第三方程序集:
免责声明:我为NDepend工作
请在Google中搜索“ depends.exe”,这是一个处理此问题的小实用程序。
LoadLibraryEx
...
LoadLibraryEx
在那里没有帮助。
pedeps项目(https://github.com/brechtsanders/pedeps)具有一个命令行工具(copypedeps),用于复制您的.exe(或.dll)文件以及它依赖的所有文件。如果在应用程序运行的系统上执行此操作,则应该能够将其附带所有依赖DLL一起提供。
请从下面的链接https://docs.microsoft.com/en-us/sysinternals/downloads/process-explorer引用Microsoft的SysInternal工具包
转到下载文件夹,以管理员权限打开“ Procexp64.exe”。打开查找菜单->“查找句柄或DLL”选项或Ctrl + F快捷方式。
试试 JetBrains dotPeek。免费。