【问题标题】:Why installing vcredist_x86.exe doesn't fix SideBySide error when I develop an EXE on one machine and run it on another one?当我在一台机器上开发 EXE 并在另一台机器上运行时,为什么安装 vcredist_x86.exe 不能修复 SideBySide 错误?
【发布时间】:2012-02-13 08:57:57
【问题描述】:

问题

我在 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;来源:SideBySide

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

事件 ID:59;来源:SideBySide

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

事件 ID:59;来源:SideBySide

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. 我从 C:\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.manifestC:\foo 并将其重命名为Microsoft.VC80.CRT.manifest

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

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

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

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

事件 ID:34;来源:SideBySide

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

事件 ID:58;来源:SideBySide

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

事件 ID:59;来源:SideBySide

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. 我从 Windows XP 机器的C:\winnt\winsxs\x86_Microsoft.VC80.CRT_1fc8b3b9a1e18e3b_8.0.50727.762_x-ww_6b128700(我开发和构建 foo.exe 的地方) 到 Windows Server 2003 的 C:\foo(我正在尝试运行 foo.exe)。
  2. 接下来,我复制了 C:\winnt\winsxs\Manifests\x86_Microsoft.VC80.CRT_1fc8b3b9a1e18e3b_8.0.50727.762_x-ww_6b128700.manifestC:\foo 并将其重命名为 Microsoft.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. msvcm80.dllmsvcp80.dllmsvcr80.dllMicrosoft.VC80.CRT.manifest 从 Windows XP 机器(我开发和构建 foo.exe)的C:\Program Files\Microsoft Visual Studio 8\VC\redist\x86\Microsoft.VC80.CRT 复制到 Windows Server 2003 机器(我在哪里)的C:\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) 可以解决此问题。但它没有。从开发机器的C:\Program Files\Microsoft Visual Studio 8\VC\redist\x86\Microsoft.VC80.CRT 文件夹中复制 DLL 和清单文件修复了它。为什么会这样?

构建选项

以防万一,它可以帮助您回答我的问题。这是我从 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

【问题讨论】:

  • 你可以从版本号看出。您的开发机器的版本为 6195,但您使用的 redist 版本非常旧:42 和 762。自 SP1 以来有几个安全补丁。最简单的方法是创建一个安装项目。
  • This 可能就是您要找的。​​span>
  • 确定构建所需的 redist 版本的最简单方法是在构建项目时检查 Visual Studio 创建的清单文件。我的地址是Mine was located at C:\Foo\Release\Foo.exe.intermediate.manifest。我在下面对我自己的问题的回答中对此进行了详细说明。

标签: c++ visual-c++ side-by-side


【解决方案1】:

这里确实存在以下问题:应用程序可执行文件使用清单机制引用 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 的非开发机器上,您可以创建虚拟项目以及适当的配置和安装程序。然后你在每台机器上安装一次,然后复制你正在处理的可执行文件。

【讨论】:

  • 你能添加一些换行符吗?这几乎是不可能阅读的。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

    我下载了Microsoft Visual C++ 2005 Service Pack 1 Redistributable Package MFC Security Update 并将其安装在我尝试运行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 在a different answer 中提到的这个问题,由于这是一个 32 位应用程序,因此有必要在该应用程序应该安装的系统上安装 vcredist_x86.exe(不是 vcredist_x64.exe)无论该系统是 32 位 Windows 系统还是 64 位 Windows 系统,都可以运行。 .manifest 文件再次在 processorArchitecture 属性中提供了这一线索。

    【讨论】:

    • 非常感谢您!三年后,你解决了我的确切问题!
    • 你也可以从xstrace.exe工具获取dll版本,解释here
    【解决方案4】:

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

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

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

    【讨论】:

    • 这是一个很好的观点。感谢您分享这个。现在,我在对这个问题的回答中添加了关于处理器架构的注释。
    【解决方案5】:

    虽然我的申请是

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

    在 win 2k3 SP2 x64 上运行

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

    安装Microsoft Visual C++ 2005 SP1 Redistributable Package (x86)后,应用就可以正常安装运行了。

    【讨论】:

      【解决方案6】:

      我遇到了一些相关的问题。两台安装了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 复制适当的清单来解决了这个问题。

      【讨论】:

      • 不,正如我所说,我有“两台安装了 VS2005 的开发 XP 机器”。与 VS2005 完全相同。
      【解决方案7】:

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

      【讨论】:

      • 感谢您的回复。这个问题已经在 5 个月前得到解答。
      猜你喜欢
      • 2013-01-03
      • 1970-01-01
      • 1970-01-01
      • 2017-12-10
      • 2023-03-29
      • 1970-01-01
      • 1970-01-01
      • 2017-07-30
      • 2018-09-18
      相关资源
      最近更新 更多