有时当我做一个小项目时,我不够小心,不小心添加了一个我不知道的DLL依赖项。当我将这个程序发送给朋友或其他人时,“它不工作”,因为“一些DLL”丢失了。这当然是因为程序可以在我的系统上找到DLL,但不能在他们的系统上找到。
是否有一种方法来扫描可执行文件的DLL依赖项或在“干净”的DLL自由环境中执行程序进行测试,以防止这些糟糕的情况?
有时当我做一个小项目时,我不够小心,不小心添加了一个我不知道的DLL依赖项。当我将这个程序发送给朋友或其他人时,“它不工作”,因为“一些DLL”丢失了。这当然是因为程序可以在我的系统上找到DLL,但不能在他们的系统上找到。
是否有一种方法来扫描可执行文件的DLL依赖项或在“干净”的DLL自由环境中执行程序进行测试,以防止这些糟糕的情况?
当前回答
在您的开发机器上,您可以执行该程序并运行Sysinternals Process Explorer。在下面的窗格中,它将显示加载的dll和它们的当前路径,这很方便,原因有很多。如果你正在执行你的部署包,它会显示哪些dll被引用在错误的路径(即没有正确打包)。
目前,我们公司使用Visual Studio Installer项目来遍历依赖树,并将其输出为程序的松散文件。在VS2013中,这现在是一个扩展:https://visualstudiogallery.msdn.microsoft.com/9abe329c-9bba-44a1-be59-0fbf6151054d。然后,我们将这些松散的文件打包到一个更全面的安装程序中,但至少该安装程序将所有的dot net依赖项放在一个位置,并在东西丢失时警告你。
其他回答
尝试依赖,它被描述为“一个开源的现代依赖步行者”。
它有一个GUI,但它也可以从可选JSON输出的命令行工作!
递归显示mydll.dll在深度为1之前的依赖项:
Dependencies.exe -chain mydll.dll -depth 1
输出示例:
□ mydll.dll (ROOT) : C:/.../mydll.dll
| □ USER32.dll (WellKnownDlls) : C:\WINDOWS\SysWOW64\user32.dll
| □ ADVAPI32.dll (WellKnownDlls) : C:\WINDOWS\SysWOW64\advapi32.dll
| □ ole32.dll (WellKnownDlls) : C:\WINDOWS\SysWOW64\ole32.dll
| □ GDI32.dll (WellKnownDlls) : C:\WINDOWS\SysWOW64\gdi32.dll
| □ CRYPT32.dll (WellKnownDlls) : C:\WINDOWS\SysWOW64\CRYPT32.dll
| □ Secur32.dll (WindowsFolder) : C:\WINDOWS\SysWOW64\Secur32.dll
| □ MSVCP140D.dll (WindowsFolder) : C:\WINDOWS\SysWOW64\MSVCP140D.dll
| □ USP10.dll (WindowsFolder) : C:\WINDOWS\SysWOW64\USP10.dll
| □ KERNEL32.dll (WellKnownDlls) : C:\WINDOWS\SysWOW64\kernel32.dll
| □ VCRUNTIME140D.dll (WindowsFolder) : C:\WINDOWS\SysWOW64\VCRUNTIME140D.dll
| □ ucrtbased.dll (WindowsFolder) : C:\WINDOWS\SysWOW64\ucrtbased.dll
注意,如果最大依赖深度很深,可能需要很长时间才能产生结果。
我可以为Linux粉丝推荐有趣的解决方案。在探索了这个解决方案之后,我已经从DependencyWalker切换到这个。
你可以使用你喜欢的ldd而不是windows相关的exe, dll。
要做到这一点,你需要在Windows上安装Cygwin(基本安装,不需要额外的软件包),然后启动Cygwin终端。现在你可以运行你最喜欢的Linux命令,包括:
$ ldd your_dll_file.dll
UPD:你也可以在Windows上通过git bash终端使用ldd。如果已经安装了git,则不需要安装cygwin。
有个程序叫"依赖" 如果你安装了cygwin,没有什么比ldd file.exe更简单的了
从Visual Studio工具(VC\bin文件夹)可以帮助:
dumpbin /dependents your_dll_file.dll
In the past (i.e. WinXP days), I used to depend/rely on DLL Dependency Walker (depends.exe) but there are times when I am still not able to determine the DLL issue(s). Ideally, we'd like to find out before runtime by inspections but if that does not resolve it (or taking too much time), you can try enabling the "loader snap" as described on http://blogs.msdn.com/b/junfeng/archive/2006/11/20/debugging-loadlibrary-failures.aspx and https://msdn.microsoft.com/en-us/library/windows/hardware/ff556886(v=vs.85).aspx and briefly mentioned LoadLibrary fails; GetLastError no help
警告:我过去一直在用gflag搞砸我的窗户,让它爬到它的膝盖,你已经被预先警告过了。
注意:“Loader snap”是每进程的,所以UI enable不会一直检查(使用cdb或glfags -i)