为什么安装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没有修复它
- 从http://www.microsoft.com/download/en/details.aspx?id=3387下载vcredist_x86.exe
- 安装它。 安装程序创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可再发行组件没有修复它
- 从http://www.microsoft.com/download/en/details.aspx?id=5638下载vcredist_x86.exe
- 安装它。 安装程序创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和清单没有修复它。
- 我将
msvcm80.dll
,msvcp80.dll
和msvcr80.dll
从C:\WINDOWS\WinSxS\x86_Microsoft.VC80.CRT_1fc8b3b9a1e18e3b_8.0.50727.42_x-ww_0de06acd
到C:\foo
。 - 接下来,我将
C:\WINDOWS\WinSxS\Manifests\x86_Microsoft.VC80.CRT_1fc8b3b9a1e18e3b_8.0.50727.42_x-ww_0de06acd.manifest
到C:\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和清单没有修复它。
- 我将
msvcm80.dll
,msvcp80.dll
和msvcr80.dll
从Windows XP机器的C:\winnt\winsxs\x86_Microsoft.VC80.CRT_1fc8b3b9a1e18e3b_8.0.50727.762_x-ww_6b128700
(我开发并构buildfoo.exe)复制到C:\foo
Windows Server 2003C:\foo
(我试图运行foo.exe)。 - 接下来,我将
C:\winnt\winsxs\Manifests\x86_Microsoft.VC80.CRT_1fc8b3b9a1e18e3b_8.0.50727.762_x-ww_6b128700.manifest
到C:\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和清单修复它。
- 从Windows XP机器的
C:\Program Files\Microsoft Visual Studio 8\VC\redist\x86\Microsoft.VC80.CRT
复制msvcm80.dll
,msvcp80.dll
,msvcr80.dll
和Microsoft.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和安装程序。 然后在每台机器上安装一次,然后复制正在执行的可执行文件。