42

问题

我在 Windows XP Professional Version 2002 Service Pack 3 上使用 Microsoft Visual Studio 2005 Verison 8.0.50727.762 (SP.050727-7600) 编写了一个名为“Foo”的 C++ 项目。我将该项目构建到 Foo.exe 中。然后,我将文件 Foo.exe 复制到 Windows Server 2003 Enterprise Edition Service Pack 2。当我尝试运行它时,它失败并出现此错误,

C:\foo.exe
The application has failed to start because the application configuration is incorrect.
Reinstalling the application may fix the problem.

在事件查看器 > 系统中,记录了三个事件。

事件 ID:32;资料来源:并排

Dependent Assembly Microsoft.VC80.CRT could not be found and Last Error was
The referenced assembly is not installed on your system.

事件 ID:59;资料来源:并排

Resolve Partial Assembly failed for Microsoft.VC80.CRT.
Reference error message: The referenced assembly is not installed on your system.

事件 ID:59;资料来源:并排

Generate Activation Context failed for C:\foo\Foo.exe.
Reference error message: The referenced assembly is not installed on your system.

安装 Microsoft Visual C++ 2005 Redistributable 没有修复它

  1. 从http://www.microsoft.com/download/en/details.aspx?id=3387下载了 vcredist_x86.exe
  2. 安装它。安装程序创建了一个名为C:\windows\winsxs\x86_Microsoft.VC80.CRT_1fc8b3b9a1e18e3b_8.0.50727.42_x-ww_0de06acd.

从“添加或删除程序”中找到该软件的版本是“8.0.50727.42”。

在尝试运行 C:\foo\foo.exe 时,我遇到了与上述相同的错误。

安装 Microsoft Visual C++ 2005 SP1 Redistributable 没有修复它

  1. 从http://www.microsoft.com/download/en/details.aspx?id=5638下载 vcredist_x86.exe
  2. 安装它。安装程序创建了一个名为: 的文件夹C:\windows\winsxs\x86_Microsoft.VC80.CRT_1fc8b3b9a1e18e3b_8.0.50727.762_x-ww_6b128700

从“添加或删除程序”中找到该软件的版本是“8.0.56336”。

在尝试运行 C:\foo\foo.exe 时,我遇到了与上述相同的错误。

从同一台机器(我正在运行 EXE)复制 CRT DLL 和清单并没有解决它。

  1. 我复制 了msvcm80.dll,从 msvcp80.dll到。msvcr80.dllC:\WINDOWS\WinSxS\x86_Microsoft.VC80.CRT_1fc8b3b9a1e18e3b_8.0.50727.42_x-ww_0de06acdC:\foo
  2. 接下来,我将其复制并重 C:\WINDOWS\WinSxS\Manifests\x86_Microsoft.VC80.CRT_1fc8b3b9a1e18e3b_8.0.50727.42_x-ww_0de06acd.manifest 命名C:\fooMicrosoft.VC80.CRT.manifest.

清单文件的第四行如下所示:

<assemblyIdentity type="win32" name="Microsoft.VC80.CRT" version="8.0.50727.42"
                  processorArchitecture="x86"
                  publicKeyToken="1fc8b3b9a1e18e3b"></assemblyIdentity>

这次我尝试运行 C:\foo\foo.exe 时,它​​不起作用。我再次使用 DLLC:\windows\winsxs\x86_Microsoft.VC80.CRT_1fc8b3b9a1e18e3b_8.0.50727.762_x-ww_6b128700和相应的清单文件重复了这件事。它也没有帮助。我得到了同样的错误。

在这两种情况下,我在事件查看器 > 系统中都遇到了以下错误。

事件 ID:34;资料来源:并排

Component identity found in manifest does not match the identity of the component requested

事件 ID:58;资料来源:并排

Syntax error in manifest or policy file "C:\foo\Microsoft.VC80.CRT.MANIFEST" on line 4.

事件 ID:59;资料来源:并排

Generate Activation Context failed for C:\foo\Foo.exe. Reference error message: The manifest file contains one or more syntax errors.

从 Windows XP 机器(我在其中构建 EXE)复制 CRT DLL 和清单并没有修复它。

  1. 我将msvcm80.dll,msvcp80.dllmsvcr80.dllC:\winnt\winsxs\x86_Microsoft.VC80.CRT_1fc8b3b9a1e18e3b_8.0.50727.762_x-ww_6b128700Windows XP 机器(我开发和构建 foo.exe)复制到C:\fooWindows Server 2003(我试图运行 foo.exe)。
  2. 接下来,我将其复制并重 C:\winnt\winsxs\Manifests\x86_Microsoft.VC80.CRT_1fc8b3b9a1e18e3b_8.0.50727.762_x-ww_6b128700.manifest 命名C:\fooMicrosoft.VC80.CRT.manifest.

清单文件的第四行如下所示:

<assemblyIdentity type="win32" name="Microsoft.VC80.CRT" version="8.0.50727.762"
                  processorArchitecture="x86"
                  publicKeyToken="1fc8b3b9a1e18e3b"></assemblyIdentity>

现在尝试运行 C:\foo\foo.exe 时,我遇到了上一节中提到的相同错误。

从 Visual Studio 文件夹复制 CRT DLL 和清单修复了它。

  1. 从Windows XP 机器(我开发和构建 foo.exe)复制到Windows Server msvcm80.dll2003机器(我试图运行它)。msvcp80.dllmsvcr80.dllMicrosoft.VC80.CRT.manifestC:\Program Files\Microsoft Visual Studio 8\VC\redist\x86\Microsoft.VC80.CRTC:\foo

清单文件的第四行如下所示:

<assemblyIdentity type="win32" name="Microsoft.VC80.CRT" version="8.0.50727.6195"
                  processorArchitecture="x86"
                  publicKeyToken="1fc8b3b9a1e18e3b"></assemblyIdentity>

这次我可以运行 C:\foo\foo.exe 没有任何问题。

问题

我期望按照第二种方法中的描述安装“Microsoft Visual C++ 2005 SP1 Redistributable”(vcredist_x86.exe)可以修复它。但它没有。从开发机器的文件夹中复制 DLL 和清单文件C:\Program Files\Microsoft Visual Studio 8\VC\redist\x86\Microsoft.VC80.CRT修复了它。为什么会这样?

构建选项

以防万一,它可以帮助您回答我的问题。这是我从 Visual Studio 项目属性中获取的编译器和链接器选项:

配置属性 > C/C++ > 命令行:

/O2 /GL /D "_MBCS" /FD /EHsc /MD /Fo"Release\\" /Fd"Release\vc80.pdb" /W3 /nologo /c /Wp64 /Zi /TP /errorReport:prompt

配置属性 > 链接器 > 命令行:

/OUT:"C:\MixedBag\Release\Foo.exe" /NOLOGO /MANIFEST /MANIFESTFILE:"Release\Foo.exe.intermediate.manifest" /DEBUG /PDB:"c:\MixedBag\release\Foo.pdb" /OPT:REF /OPT:ICF /LTCG /MACHINE:X86 /ERRORREPORT:PROMPT kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib

4

7 回答 7

52

我会回答我自己的问题。Hans Passant 和 Luke 对这个问题的评论很有帮助。

我下载了Microsoft Visual C++ 2005 Service Pack 1 Redistributable Package MFC 安全更新并将其安装在我尝试运行的系统上C:\foo\foo.exe。在此之后,EXE 运行良好。

安装程序将 CRT DLL 放在C:\windows\winsxs\x86_Microsoft.VC80.CRT_1fc8b3b9a1e18e3b_8.0.50727.6195_x-ww_44262b86. 所以,是的,正如 Hans Passant 所说,8.0.50727.6195 是我正在寻找的 CRT DLL 的版本。

计算此版本的最简单方法是在开发系统上构建我的项目时查看 Visual Studio 生成的清单文件。我的位于C:\Foo\Release\Foo.exe.intermediate.manifest。它有一个这样的标签:

<assemblyIdentity type='win32' name='Microsoft.VC80.CRT' version='8.0.50727.6195'
                  processorArchitecture='x86'
                  publicKeyToken='1fc8b3b9a1e18e3b' />

所以,这是我需要 8.0.50727.6195 版本的 DLL 的线索。剩下的就是搜索正确的 vcredist_x86.exe,它恰好位于我在第二段中提到的 URL 中。该 URL 中的页面包含指向KB2538242的链接,该链接显示安装程序将安装的 DLL 的版本号。

注意:正如 Elie 在对此问题的不同答案中所提到的,由于这是一个 32 位应用程序,因此必须在应该运行此应用程序的系统上安装 vcredist_x86.exe(不是 vcredist_x64.exe),而不管该系统是 32 位 Windows 系统还是 64 位 Windows 系统。.manifest 文件再次在processorArchitecture属性中提供了这一线索。

于 2012-01-19T10:44:28.100 回答
4

您必须安装“Microsoft Visual C++ 2005 Service Pack 1 Redistributable Package MFC 安全更新”,此处为:http: //www.microsoft.com/en-us/download/details.aspx?id=26347

于 2012-05-17T14:38:42.047 回答
4

以下是解决此问题的方法:

如果正在使用的应用程序是 32 位的,并且您尝试在安装了VC_REDISTx64的 64 位操作系统上运行它,您仍然会得到并排错误。

简单的解决方案,您还必须在 64 位操作系统上加载 VC_REDISTx86

于 2012-11-21T18:37:21.933 回答
3

我有一个有点相关的问题。两台安装了VS2005的开发XP机器,分别称为A和B。我在A上开发、构建和运行。然后我将整个项目复制到B。在那里构建。尝试运行并得到 SusamPal 提到的相同错误消息。我意识到在 B 的 WinSxS 上有 x86_Microsoft.VC80.CRT_xxx 清单(和文件夹),但没有相应的 x86_Microsoft.VC80.DebugCRT_xxx 清单(为什么?!)。我尝试了 SusamPal 描述的几种舞蹈和咒语,但无济于事。我通过将适当的文件夹从 A 的 WinSxS 复制到 B 并从 WinSxs\Manifests 复制适当的清单来解决了这个问题。

于 2012-10-17T09:03:31.010 回答
3

虽然我的申请是

使用 vs2008 在 Win 2k8 R2 x64 上开发(在 C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\redist\amd64\Microsoft.VC90.CRT 中有 msvcm90.dll、msvcp90.dll 和 msvcr90.dll)

并在 win 2k3 SP2 x64 上运行,

但需要 msvcm80.dll、msvcp80.dll 和 msvcr80.dll。

安装Microsoft Visual C++ 2005 SP1 Redistributable Package (x86)后,可以正确安装和运行应用程序。

于 2012-10-30T07:35:19.667 回答
0

对我来说,并排错误只是通过在设置 c/c++ ->CodeGeneration->RuntimeLibrary 下进行,使其成为多线程调试的 MTD

于 2014-06-03T19:03:57.183 回答
-2

我们在这里确实存在以下问题:应用程序可执行文件使用清单机制引用 dll。在过去,应用程序作者只是将所需的 dll 复制到系统目录中。不幸的是,当不兼容的较新版本覆盖较旧的 dll 版本时,这会导致所谓的“dll 地狱”问题,这可能会使应用程序停止工作。然后 MS 提出了版本控制的想法(winsxs)。

不幸的是,这是一个相当复杂的机器,尝试手动将 dll(程序集)安装到 sxs 文件夹中绝对不是一个好主意。安装所谓的“可再发行包”也不是一个完美的解决方案。

此外,当我们需要调试版本时,这无济于事。由于 MS 禁止分发支持 dll 的调试版本,因此“可再分发包”不会安装它们。(请注意,程序集 id 取决于当前的 VS2005 版本,并且与已安装的支持库有关。)

通常,VS 安装程序会将所需的程序集添加到系统中,但在安装更新或更新的 SDK 和工具一段时间后,可能会损坏此正确状态。

假设我们有这种情况——我们的调试库不再集成到系统中。假设我们已经给了带有项目 A 的工作区,并且活动调试配置给出了不工作的应用程序。然后我们可以创建安装程序项目,比如在当前工作区中的 C,将我们的应用程序(或者严格来说,具有活动配置的项目)添加到它。设置安装程序项目以将我们的可执行文件放在某个地方(桌面是这种情况的正确位置)启用依赖项检查和其他一些次要属性。然后构建项目 C 并运行安装程序(或使用上下文菜单从 VS“安装”)。现在您的应用程序和其他使用调试 dll 库创建的应用程序开始工作。

当您使用“删除”选项运行安装程序时要小心,您会遇到以前的情况。这是与分发主题相关的好文章:http: //blogs.msdn.com/b/vcblog/archive/2007/10/12/how-to-redistribute-the-visual-c-libraries-with-your-application .aspx

如果您有一些其他应用程序并且想简单地通过复制来部署它们,也许在没有安装 VS 的非开发机器上,您可以创建虚拟项目以及适当的配置和安装程序。然后,您在每台机器上安装一次,然后复制您正在处理的可执行文件。

于 2015-06-28T13:00:55.650 回答