我构建了一个动态链接到多个DLL的可执行文件。其中大多数都默认安装在Windows上,但版本可能略有不同。其他我随应用程序分发,但他们反过来可能依赖于其他DLL。
如果我在本地运行可执行文件并收到Windows错误消息,说“无法加载[无论如何]。应用程序配置不正确”这似乎意味着缺少“依赖于什么”的库。但它(相当令人愤怒地)省略了确切地指定它在加载时遇到问题的DLL。有时我可以使用Dependency Walker来查看是否有任何明显缺失的库。其他时候,我可以使用Process Monitor来显示Windows在发出错误消息之前要查找的文件。
但这些并不是最终用户在尝试诊断问题时必须使用的工具。是否有任何方法可以哄骗Windows来准确说出哪个库无法解析,以便将其输出到日志或显示在消息框中?
答案 0 :(得分:1)
根据我的经验,这种错误的一个常见原因是意外地发送了与C运行时的调试版本链接的组件,该组件明确地不可再发行,因此它只在最终用户的系统上运行碰巧安装了VisualStudio的匹配版本。它的名称类似于MSVCR80D.DLL
,而不是MSVCR80.DLL
。
Dependency Walker当然是用于检查作为开发人员的可执行文件的正确工具。它可以挂钩DLL加载事件的应用程序并运行它,因此您可以发现在运行时动态加载的DLL以及在构建时命名的DLL。
Dependency Walker也是可编写脚本的,可以编写日志文件。我将这种方式用作构建过程的一部分,以便在打包发布之前验证货件。我将所有要发送的文件放入其交付目录树的模型中。我使用由依赖者walker托管的应用程序的调试模式,使其加载所有可选的位和部分然后退出。 Depends.exe给我留下了一个很好的日志文件,我用Perl脚本检查并且如果从\WINDOWS
或暂存区域以外的系统上的任何地方加载任何DLL,或者如果是意外的版本或调试,则会使构建失败已加载C运行时的版本。只有在检查成功之后才构建将要发布的InnoSetup安装程序包。这已经在几个场合挽回了尴尬,非常值得花时间去弄清楚如何去做。
如果您知道每个DLL都是“官方”Windows DLL或您的货件的一部分,那么您很有可能只是在客户的机器上工作。
编辑: Dependency Walker的官方住所是一个值得探索的好地方。在那里提供的版本可能比MSVS附带的版本更新,并且有相当数量的关于高级用途的体面文档。
我可以确认我已经在depends.exe下运行了IE配置文件,但没有经过多少测试。
答案 1 :(得分:0)
Windows事件日志通常包含这些消息后的一些有价值的信息。
在XP中,右键单击“我的电脑”,选择“管理”并转到那里的“事件查看器”,检查系统日志,查找有关消息框出现时间的错误消息。应该有一些。其中一个将包含违规dll的名称。
答案 2 :(得分:0)
我觉得有用的一种技术是在Visual Studio中创建一个安装程序项目(即使你最终没有发布它)。在解决方案中,创建一个新的安装和部署项目,并将项目的主要输出添加到其中,然后构建安装程序。这将执行一个dll依赖项检查阶段,您将在“检测到的依赖项”部分中看到该阶段。因此,如果你有任何dll,你应该在这个列表中看到它们。
当然,既然你有一个只需要5分钟设置的安装程序,你可以发布它,它将处理确保Visual Studio运行时也正确设置。