有时当我做一个小项目时,我不够小心,不小心为我不知道的DLL添加依赖项。当我将此程序发送给朋友或其他人时,“它不起作用”,因为“某些DLL”丢失了。这当然是因为程序可以在我的系统上找到DLL,但不能在他们的系统上找到。
有没有办法扫描可执行文件的DLL依赖项或在“干净的”无DLL环境中执行程序进行测试,以防止这些oops情况?
尝试依赖性walker:http://www.dependencywalker.com/
如果您有源代码,则可以使用ndepend。
http://blogs.msdn.com/b/junfeng/archive/2006/11/20/debugging-loadlibrary-failures.aspx
它价格昂贵,并且比分析依赖关系做得更多,因此对于您正在寻找的内容可能过度。
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第三方程序集未解析:
免责声明:我为NDepend工作
Visual Studio工具(VC \ bin文件夹)中的dumpbin
可以在这里提供帮助:
dumpbin /dependents your_dll_file.dll
$ ldd your_dll_file.dll
,其中ldd
是您在步骤2中找到的路径Bam,你有你的依赖信息。窗口应如下所示:
最安全的是拥有一些干净的虚拟机,您可以在其上测试您的程序。在您要测试的每个版本上,将VM还原为其初始清洁值。然后使用其设置安装程序,看看它是否有效。
Dll问题有不同的面孔。如果使用Visual Studio并动态链接到CRT,则必须分发CRT DLL。更新您的VS,您必须分发另一个版本的CRT。仅检查依赖关系是不够的,因为您可能会错过这些。在干净的机器上进行完全安装是唯一安全的解决方案,IMO。
如果您不想设置完整的测试环境并使用Windows 7,则可以使用XP-Mode作为初始清理计算机,使用dumpbin /dependents [path]
复制VM。
在过去(即WinXP日),我曾经依赖/依赖DLL Dependency Walker(depends.exe),但有时候我仍然无法确定DLL问题。理想情况下,我们希望在运行之前通过检查发现,但如果不解决它(或花费太多时间),您可以尝试启用XP-More和Sysinternals Process Explorer上描述的“加载器快照”并简要提及https://visualstudiogallery.msdn.microsoft.com/9abe329c-9bba-44a1-be59-0fbf6151054d
警告:我过去搞砸了我的Windows,因为gflag让它匍匐前行,你已经被预先警告了。
注意:“Loader snap”是每个进程,因此UI启用不会保持检查(使用cdb或glfags -i)
请在google中搜索“depends.exe”,这是一个很小的实用程序来处理这个问题。