我们将 Visual C++ 运行时分发为私有程序集(即,将 msvcp90.dll、msvcm90.dll、msvcr90.dll 和 Microsoft.VC90.CRT.manifest 放入与我们的应用程序的可执行文件)。到目前为止,在每台非开发机器(数百台)上,这都很好。但是,我一直在追踪一台完全无法找到这些程序集的特定问题机器。
他们正在运行 XP,所以当他们尝试启动我们的应用程序时,他们会收到以下消息:
此应用程序无法启动,因为应用程序配置不正确。重新安装应用程序可能会解决此问题。
我让他们在我们的应用程序的 exe 上运行Dependency Walker,它表明它找不到 msvcp90.dll 或 msvcr90.dll。然后我让他们追踪我们应用程序的目录内容,这表明那些“丢失”的 DLL 实际上是它们应该在的位置(在与 exe 相邻的 Microsoft.VC90.CRT 目录中),但无论如何,应用程序只是在启动时找不到它们。
作为最后的手段,我让他们直接安装可再发行组件,但这主要只是为了排除故障,因为我们更愿意继续分发 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>
编辑:我之前提到没有 a dependentAssembly
,但我意识到它正在生成,所以上面的清单反映了它创建的实际清单。
什么会导致程序根本找不到这些依赖项? 它发现它们在许多其他计算机上都很好,其中大多数以前从未见过这些运行时。我可能搞砸了一些基本的东西(很可能在我的清单中),但到目前为止它在 99% 的客户端计算机上运行良好。
作为奖励,这篇文章是对私有程序集的一个很好的总结,但到目前为止它还没有帮助我解决问题。
更新:将 DLL 移动到与 EXE 相同的目录后,它仍然无法启动。然后,在安装 redistributables之后,它启动得很好。所以看起来它要么没有在本地目录中查找,要么由于某种原因认为本地 DLL 不可接受。