有时当我做一个小项目时,我不够小心,不小心为我不知道的DLL添加依赖项。当我将此程序发送给朋友或其他人时,“它不起作用”,因为“某些DLL”丢失了。这当然是因为程序可以在我的系统上找到DLL,但不能在他们的系统上找到。
有没有办法扫描DLL依赖项的可执行文件或在“干净的”无DLL环境中执行程序以进行测试以防止这些 oops 情况?
答案 0 :(得分:166)
dumpbin
可以在这里提供帮助:
dumpbin /dependents your_dll_file.dll
答案 1 :(得分:81)
尝试依赖性walker:http://www.dependencywalker.com/
答案 2 :(得分:35)
我可以为Linux粉丝推荐有趣的解决方案。在我探索了这个解决方案之后,我已经从DependencyWalker切换到了这个。
您可以使用自己喜欢的ldd
而不是与Windows相关的exe
,dll
。
要执行此操作,您需要在Windows上安装Cygwin(基本安装,无需其他软件包),然后启动Cygwin Terminal
。现在您可以运行您喜欢的Linux命令,包括:
$ ldd your_dll_file.dll
UPD:您也可以通过git bash terminal on Windows使用ldd
。如果已经安装了git,则无需安装cygwin。
答案 3 :(得分:10)
按下开始按钮,输入“ dev”。启动名为“ VS 2017开发人员命令提示符”的程序
找出要使用的程序集的完整文件路径
在打开的窗口中,输入dumpbin /dependents [path]
,其中[path]
是您在步骤2中确定的路径
按Enter键
Bam,您已经有了依赖项信息。窗口应如下所示:
答案 4 :(得分:9)
答案 5 :(得分:8)
最安全的是拥有一些干净的虚拟机,您可以在其上测试您的程序。在您要测试的每个版本上,将VM还原为其初始清洁值。然后使用其设置安装程序,看看它是否有效。
Dll问题有不同的面孔。如果使用Visual Studio并动态链接到CRT,则必须分发CRT DLL。更新您的VS,您必须分发另一个版本的CRT。仅检查依赖关系是不够的,因为您可能会错过这些。在干净的机器上进行完全安装是唯一安全的解决方案,IMO。
如果您不想设置完整的测试环境并使用Windows 7,则可以使用XP-Mode作为初始清理计算机,并使用XP-More复制VM。
答案 6 :(得分:6)
在您的开发计算机上,您可以执行该程序并运行Sysinternals Process Explorer。在下部窗格中,它将显示加载的DLL和它们的当前路径,由于多种原因这很方便。如果您正在执行部署程序包,它将显示在错误的路径中引用了哪些DLL(即未正确打包)。
目前,我们公司使用Visual Studio Installer项目来遍历依赖树并输出作为程序的松散文件。在VS2013中,现在这是一个扩展名:https://visualstudiogallery.msdn.microsoft.com/9abe329c-9bba-44a1-be59-0fbf6151054d。然后我们将这些松散的文件打包到一个更全面的安装程序中,但至少该设置项目会将所有点网依赖项放到一个位置并将它们放到一个位置,并在缺少任何内容时发出警告。
答案 7 :(得分:2)
在过去(即WinXP日),我曾经依赖/依赖DLL Dependency Walker(depends.exe),但有时候我仍然无法确定DLL问题。理想情况下,我们希望在运行之前通过检查找出但如果没有解决它(或花费太多时间),您可以尝试按http://blogs.msdn.com/b/junfeng/archive/2006/11/20/debugging-loadlibrary-failures.aspx和{{3}所述启用“加载程序快照”并简要提到https://msdn.microsoft.com/en-us/library/windows/hardware/ff556886(v=vs.85).aspx
警告:我过去搞砸了我的Windows,因为gflag让它跪倒在地,你已经预先警告过。
注意:“Loader snap”是每个进程,因此UI启用不会保持检查(使用cdb或glfags -i)
答案 8 :(得分:1)
请在google中搜索“depends.exe”,这是一个很小的实用程序来处理这个问题。
答案 9 :(得分:1)
答案 10 :(得分:1)
Jesse已经提到了NDepend(如果你分析.NET代码),但我们可以准确地解释它是如何帮助的。
是否有可以扫描DLL的可执行文件的程序/脚本 依赖或在“干净的”无DLL环境中执行程序 用于测试以防止这些oops情况?
在NDepend Project Properties面板中,您可以定义要分析的应用程序集(绿色)和 NDepend将推断应用程序使用的第三方程序集(蓝色)。提供了搜索应用程序和第三方程序集的目录列表。
如果在这些目录中找不到第三方程序集,则它将处于错误模式。例如,如果我删除.NET Fx目录C:\WINDOWS\Microsoft.NET\Framework\v4.0.30319
,我可以看到.NET Fx第三方程序集未解析:
免责声明:我为NDepend工作
答案 11 :(得分:0)
请从下面的链接中参考Microsoft的SysInternal工具包, https://docs.microsoft.com/en-us/sysinternals/downloads/process-explorer
转到下载文件夹,以管理员权限打开“ Procexp64.exe”。 打开查找菜单->“查找句柄或DLL”选项或Ctrl + F快捷方式。
答案 12 :(得分:0)
尝试JetBrains dotPeek。它是免费的。
答案 13 :(得分:0)
I wrote a modern C++
command line utility 用于查找递归 DLL
依赖项。它易于使用并输出一个 JSON
,其中包含有关引用的 DLL
、DLL
加载失败和丢失的 DLL
的宝贵信息。
答案 14 :(得分:-1)
pedeps项目(https://github.com/brechtsanders/pedeps)具有一个命令行工具(copypedeps),用于复制您的.exe(或.dll)文件以及它依赖的所有文件。 如果在应用程序运行的系统上执行此操作,则应该能够将其附带所有依赖DLL一起提供。