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

是否有一种方法来扫描可执行文件的DLL依赖项或在“干净”的DLL自由环境中执行程序进行测试,以防止这些糟糕的情况?


当前回答

DLL是在“调试模式”下编译然后部署的吗?

如果是这样,它可能依赖于dll的“D”版本。例如:

  MSVCP140D.dll
  VCRUNTIME140D.dll

如果DLL是在“发布模式”下构建的,这些将不是依赖项。D版本不附带Microsoft Visual c++ Redistributables。

事实是否如此,正如其他人指出的那样:

从Visual Studio:工具-> Visual Studio命令提示符。

在命令提示符中对DLL运行dumpbin / dependencies。

其他回答

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

目前,我们公司使用Visual Studio Installer项目来遍历依赖树,并将其输出为程序的松散文件。在VS2013中,这现在是一个扩展:https://visualstudiogallery.msdn.microsoft.com/9abe329c-9bba-44a1-be59-0fbf6151054d。然后,我们将这些松散的文件打包到一个更全面的安装程序中,但至少该安装程序将所有的dot net依赖项放在一个位置,并在东西丢失时警告你。

有个程序叫"依赖" 如果你安装了cygwin,没有什么比ldd file.exe更简单的了

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)

请参考SysInternal工具包从微软下面的链接, https://learn.microsoft.com/en-us/sysinternals/downloads/process-explorer

进入下载文件夹,以管理员权限打开Procexp64.exe。 打开查找菜单->“查找句柄或DLL”选项或Ctrl+F快捷方式。

DLL是在“调试模式”下编译然后部署的吗?

如果是这样,它可能依赖于dll的“D”版本。例如:

  MSVCP140D.dll
  VCRUNTIME140D.dll

如果DLL是在“发布模式”下构建的,这些将不是依赖项。D版本不附带Microsoft Visual c++ Redistributables。

事实是否如此,正如其他人指出的那样:

从Visual Studio:工具-> Visual Studio命令提示符。

在命令提示符中对DLL运行dumpbin / dependencies。