如何检查DLL依赖?
有时当我正在做一个小项目时,我不够小心,意外地为我不知道的DLL添加依赖项。 当我把这个程序发送给朋友或其他人“它不工作”,因为“一些DLL”丢失。 这是当然的,因为程序可以在我的系统上findDLL,而不是他们的。
有一个程序/脚本,可以扫描DLL的依赖项的可执行文件或执行程序在一个“干净的”无DLL的环境进行testing,以防止这些oops情况?
尝试依赖沃克: http : //www.dependencywalker.com/
从Visual Studio工具(VC \ bin文件夹)的dumpbin
可以在这里帮助:
dumpbin /dependents your_dll_file.dll
我可以为Linux粉丝推荐有趣的解决scheme。 在我探索这个解决scheme之后,我从DependencyWalker切换到了这个。
你可以使用你最喜欢的ldd
在Windows相关的exe
, dll
。
为此,您需要在Windows上安装Cygwin (基本安装,不需要额外的软件包),然后启动Cygwin Terminal
。 现在你可以运行你最喜欢的Linux命令,包括:
$ ldd your_dll_file.dll
- 有一个名为“取决于”的程序
- 如果你已经安装了cygwin,没有什么简单的ldd file.exe
最安全的是有一些干净的虚拟机,你可以testing你的程序。 在您要testing的每个版本上,将VM恢复到其初始清理值。 然后使用它的安装程序来安装你的程序,看看它是否有效。
DLL问题有不同的面孔。 如果您使用Visual Studio并dynamic链接到CRT,则必须分发CRT DLL。 更新你的VS,你必须分发另一个版本的CRT。 只检查依赖关系是不够的,因为你可能会错过这些。 在干净的机器上进行全面安装是唯一的安全解决scheme。
如果你不想build立一个全面的testing环境并且拥有Windows 7,那么你可以使用XP-Mode作为初始清理机器,而使用XP-More来复制VM。
在您的开发机器上,您可以执行该程序并运行Sysinternals Process Explorer 。 在下面的窗格中,它将向您显示加载的DLL和当前path,由于多种原因,这些path非常方便。 如果正在执行部署包,则会显示哪些DLL在错误path中被引用(即没有正确打包)。
目前,我们公司使用Visual Studio Installer项目来执行依赖关系树和输出作为松散文件的程序。 在VS2013中,这是一个扩展: https ://visualstudiogallery.msdn.microsoft.com/9abe329c-9bba-44a1-be59-0fbf6151054d。 然后,我们将这些松散的文件打包成一个更全面的安装程序,但是至less该安装程序投影了所有的networking依赖关系,并将它们放到一个位置,并在缺less事物时提醒您。
在过去(即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/en-us/library/windows/hardware/ff556886(v=vs.85).aspx并简单地提到LoadLibrary失败; GetLastError没有帮助
警告:我已经搞乱了我的窗口过去鬼混,使它爬到膝盖,你已经预先警告。
注意:“Loader snap”是每个进程,所以UI启用不会保持被检查(使用cdb或glfags -i)
请在google中search“depends.exe”,这是一个很小的工具来处理这个问题。
Jesse已经提到了NDepend(如果你分析.NET代码的话),但是让我们解释一下它是如何提供帮助的。
有一个程序/脚本,可以扫描DLL的依赖项的可执行文件或执行程序在一个“干净的”无DLL的环境进行testing,以防止这些oops情况?
在NDepend Project Properties面板中,可以定义要分析的应用程序集(绿色), NDepend将推断应用程序使用的第三方程序集 (蓝色)。 提供了search应用程序和第三方程序集的目录列表。
如果在这些目录中找不到第三方程序集,它将处于错误模式。 例如,如果我删除.NET Fx目录C:\WINDOWS\Microsoft.NET\Framework\v4.0.30319
我可以看到.NET Fx第三方程序集不解决:
免责声明:我为NDepend工作