1

我们将 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 不可接受。

4

2 回答 2

1

当前是否在同一台 Windows 机器上安装了任何版本的 Visual Studio?

您还可以仔细查看http://msdn.microsoft.com/en-us/library/windows/desktop/ms682586(v=vs.85).aspx。此链接包含有关操作系统如何搜索 DLL 的信息。有一些注册表项可能会改变这种行为。

消除这种依赖性的其他选择是在项目中使用带有 MFC/ATL 的静态链接。您的二进制文件会更大,但您可以一起消除这个问题。

于 2012-02-24T16:23:38.047 回答
0

我本来打算早点回到这个问题上,但它在等待一个测试用例。事实证明这是一个非常简单的问题:它正在寻找错误的 DLL 版本。VS 生成的清单未设置为使用我从 VS 中提取的相同版本的可再发行组件。通过禁用清单的自动生成并仅在我自己的清单中设置版本以匹配我正在重新分发的 DLL 的版本,它可以工作。

于 2012-04-10T14:46:11.627 回答