我们将Visual C ++运行时分发为private assemblies(即将msvcp90.dll,msvcm90.dll,msvcr90.dll和Microsoft.VC90.CRT.manifest放入Microsoft.VC90.CRT中与我们应用程序的可执行文件存在于同一目录中的文件夹)。到目前为止,在每台非开发机器(几百台)上,这都很好。但是,我一直在追踪一个完全无法找到这些程序集的特定问题机器。
他们正在运行XP,因此当他们尝试启动我们的应用时,他们会获得message:
此应用程序无法启动,因为该应用程序 配置不正确。重新安装应用程序可能会解决此问题 问题
我让他们在我们的应用程序的exe上运行Dependency Walker,它表示找不到msvcp90.dll或msvcr90.dll。然后我让他们追踪我们的应用程序的目录内容,这显示那些"缺少" DLL实际上应该是它们所在的位置(在与exe相邻的Microsoft.VC90.CRT目录中),但是,应用程序在启动时并没有找到它们。
作为最后的手段,我直接使用install the redistributables,但这主要是为了排除故障,因为我们更愿意继续分发DLL而无需额外的安装程序(我们的应用程序可以简单在没有任何安装的情况下运行。)
我可能还应该包含我们的应用程序自己的清单:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<assemblyIdentity version="1.0.0.0" processorArchitecture="X86" name="OurApp.Name" type="win32"/>
<description>Our App Description</description>
<trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
<security>
<requestedPrivileges>
<requestedExecutionLevel level="asInvoker" uiAccess="false"/>
</requestedPrivileges>
</security>
</trustInfo>
<dependency>
<dependentAssembly>
<assemblyIdentity type="win32" name="Microsoft.VC90.CRT" version="9.0.21022.8" processorArchitecture="x86" publicKeyToken="1fc8b3b9a1e18e3b">
</assemblyIdentity>
</dependentAssembly>
</dependency>
</assembly>
编辑:我之前提到过没有dependentAssembly
,但我意识到它正在生成,所以上面的清单反映了它创建的实际清单。
什么可能导致程序根本找不到这些依赖项?它在许多其他计算机上发现它们很好,其中大多数计算机之前从未见过这些运行时。我可能搞乱了一些基本的东西(最有可能在我的清单中),但到目前为止它在99%的客户端计算机上运行良好。
作为奖励,this article是私人集会的一个很好的总结,但到目前为止它还没有为我解决问题。
更新:将DLL移动到与EXE相同的目录后,仍然无法启动。然后,在installing the redistributables之后,它发射良好。所以它似乎要么没有查看本地目录,要么出于某种原因认为本地DLL不可接受。
答案 0 :(得分:1)
当前是否在同一台Windows机器上安装了Visual Studio的任何版本?
您也可以仔细查看http://msdn.microsoft.com/en-us/library/windows/desktop/ms682586(v=vs.85).aspx。此链接包含有关操作系统如何搜索DLL的信息。有一些注册表项可能会改变这种行为。
消除此依赖关系的其他选项是在项目中使用与MFC / ATL的静态链接。你的二进制文件会更大,但你可以一起消除这个问题..
答案 1 :(得分:0)
我的意思是尽快回到这里,但它正在等待测试用例。事实证明这是一个非常简单的问题:它正在寻找错误的DLL版本。由VS生成的清单未设置为使用从VS中提取的相同版本的可再发行组件。通过禁用清单的自动生成并仅在我自己的清单中设置版本以匹配我正在重新分发的DLL的版本,它可以正常工作。