为什么安装vcredist_x86.exe不能解决SideBySide错误,当我在一台机器上开发一个EXE并在另一台机器上运行它?

问题

我在Windows XP Professional版本2002 Service Pack 3上使用Microsoft Visual Studio 2005 Verison 8.0.50727.762(SP.050727-7600)编写了名为“Foo”的C ++项目。我将该项目构build到Foo.exe中。 然后,我将文件Foo.exe复制到Windows Server 2003企业版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. 

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

事件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. 安装它。 安装程序创build了一个名为C:\windows\winsxs\x86_Microsoft.VC80.CRT_1fc8b3b9a1e18e3b_8.0.50727.42_x-ww_0de06acd的文件夹。

从“添加或删除程序”中find的这个软件的版本是“8.0.50727.42”。

试图运行C:\ foo \ foo.exe,我得到了上面描述的相同的错误。

安装Microsoft Visual C ++ 2005 SP1可再发行组件没有修复它

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

从“添加或删除程序”中find的这个软件的版本是“8.0.56336”。

试图运行C:\ foo \ foo.exe,我得到了上面描述的相同的错误。

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

  1. 我将msvcm80.dllmsvcp80.dllmsvcr80.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.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和相应的清单文件重复这个事情。 这也没有帮助。 我得到了同样的错误。

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

事件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机器(我构buildEXE的地方)复制CRT DLL和清单没有修复它。

  1. 我将msvcm80.dllmsvcp80.dllmsvcr80.dll从Windows XP机器的C:\winnt\winsxs\x86_Microsoft.VC80.CRT_1fc8b3b9a1e18e3b_8.0.50727.762_x-ww_6b128700 (我开发并构buildfoo.exe)复制到C:\foo 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. 从Windows XP机器的C:\Program Files\Microsoft Visual Studio 8\VC\redist\x86\Microsoft.VC80.CRT复制msvcm80.dllmsvcp80.dllmsvcr80.dllMicrosoft.VC80.CRT.manifest (其中I开发和build立foo.exe)到C:\foo的Windows Server 2003机器(我试图运行它)。

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

 <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可再发行组件”(vcredist_x86.exe),如第二种方法所述,可以解决这个问题。 但事实并非如此。 从开发计算机的C:\Program Files\Microsoft Visual Studio 8\VC\redist\x86\Microsoft.VC80.CRT文件夹复制DLL和清单文件修复了它。 为什么这样?

构build选项

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

configuration属性> C / C ++>命令行:

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

configuration属性>链接器>命令行:

/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

我会回答我自己的问题。 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 。 所以,是的,8.0.50727.6195就是Hans Passant正确表示的那个CRT DLL的版本。

这个版本的最简单的方法是在开发系统上构build我的项目时查看由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。 剩下的事情就是search正确的vcredist_x86.exe,这正是我在第二段中提到的URL。 该URL中的页面包含KB2538242的链接,该链接显示安装程序将安装的DLL的版本号。

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

以下是你如何解决这个问题:

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

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

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

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

虽然我的申请是

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

并在win 2k3 SP2 x64上运行,

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

安装Microsoft Visual C ++ 2005 SP1可再发行组件包(x86)后 ,该应用程序可以安装并正确运行。

对我来说,并排错误只是通过在设置c / c ++ – > CodeGeneration-> RuntimeLibrary下进行设置,使其成为multithreadingdebugging

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

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

另外,当我们想要debugging版本的时候,这不起作用。 由于MS禁止分发支持dll的debugging版本,“可再发行的软件包”将不会安装它们。 (请注意,程序集ID取决于VS2005的当前版本,与安装的支持库有关。

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

假设我们有这种情况 – 我们的debugging库不再集成到系统中。 假设我们已经给工作区提供了项目A,而主动debuggingconfiguration没有提供可用的应用程序。 然后,我们可以创build安装程序项目,比如在当前工作空间中的C,将它添加到我们的应用程序(或者严格来说,使用活动configuration的项目)。 设置安装程序项目把我们的可执行文件放在某个地方(桌面是正确的地方,这种情况下)启用依赖性检查和一些其他小属性。 然后build立项目C并运行安装程序(或使用上下文菜单从VS“安装”)。 现在,您的应用程序和其他创build与debuggingDLL库开始工作。

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

如果你有一些其他的应用程序,并希望简单地通过复制来部署它们,也许在没有安装VS的非开发机器上,你可以创build一个虚拟项目以及相应的configuration和安装程序。 然后在每台机器上安装一次,然后复制正在执行的可执行文件。