![](/img/trans.png)
[英]Why does MSVS 2010 MFC project depend on vcredist_x86.exe for MSVS 2008?
[英]Why installing vcredist_x86.exe doesn't fix SideBySide error when I develop an EXE on one machine and run it on another one?
问题
我在Windows XP Professional版本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企业版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没有修复它
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没有修复它
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和清单并没有解决它。
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机器(我构建EXE)复制CRT DLL和清单并没有解决它。
C:\\winnt\\winsxs\\x86_Microsoft.VC80.CRT_1fc8b3b9a1e18e3b_8.0.50727.762_x-ww_6b128700
的msvcm80.dll
, msvcp80.dll
和msvcr80.dll
复制到C:\\foo
Windows Server 2003的C:\\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和清单修复它。
C:\\Program Files\\Microsoft Visual Studio 8\\VC\\redist\\x86\\Microsoft.VC80.CRT
复制msvcm80.dll
, msvcp80.dll
, msvcr80.dll
和Microsoft.VC80.CRT.manifest
(我在哪里开发并构建了foo.exe)到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
我会回答我自己的问题。 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是我正在寻找的CRT DLL的版本,正如Hans Passant正确地说的那样。
计算此版本的最简单方法是在开发系统上构建项目时查看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
属性中提供了这个线索。
您必须安装“Microsoft Visual C ++ 2005 Service Pack 1可再发行组件包MFC安全更新 ”,其中包括: http : //www.microsoft.com/en-us/download/details.aspx?id = 26347
以下是解决此问题的方法:
你仍然会得到的sidebyside错误如果正在使用的应用程序是32位,并尝试在其上安装了一个VC_REDISTx64 64位操作系统上运行它。
简单的解决方案,您还必须在64位操作系统上加载VC_REDISTx86
我有一个相关的问题。 安装了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中的相应清单来解决了这个问题。
虽然我的申请是
在Win 2K8 R2 x64的使用VS2008 开发 (其中有msvcm90.dll,msvcp90.dll和MSVCR90.DLL在C:\\ Program Files文件(x86)的\\微软的Visual Studio 9.0 \\ VC \\ REDIST \\ AMD64 \\ Microsoft.VC90.CRT)
跑在Win 2K3 SP2 64位,
但是需要msvcm80.dll,msvcp80.dll和msvcr80.dll。
安装Microsoft Visual C ++ 2005 SP1可再发行组件包(x86)后 ,可以正确安装和运行该应用程序。
对我来说,并排错误只是通过设置c / c ++ - > CodeGeneration-> RuntimeLibrary,使其成为MTD即多线程调试
我们在这里确实存在以下问题:应用程序可执行文件使用清单机制引用dll。 在过去的应用程序中,作者只需将所需的dll复制到系统目录中。 不幸的是,当通过不兼容的新版本覆盖旧的DLL版本时,这会导致所谓的“dll hell”问题,这会导致应用程序停止工作。 然后,MS想出了版本化的想法(winsxs)。
不幸的是,这是非常复杂的机器,尝试手动将dll(程序集)安装到sxs文件夹中绝对不是一个好主意。 安装所谓的“可再发行软件包”也不是一个完美的解决方案。
另外,当我们想要调试版本时,这无济于事。 由于MS禁止分发支持dll的调试版本,“可再发行软件包”不会安装它们。 (请注意,程序集ID取决于VS2005的当前subversion,并且与已安装的支持库有关。)
通常,VS安装程序会将所需的程序集添加到系统中,但在一段时间后安装更新或更新的SDK和工具可能会损坏此正确状态。
假设我们遇到这种情况 - 我们的调试库不再集成到系统中。 假设我们已经为项目A和活动调试配置提供了工作空间,而不是工作应用程序。 然后我们可以在当前工作空间中创建安装程序项目,比如说C,添加我们的应用程序(或严格地说,使用活动配置的项目)。 安装程序安装程序项目将我们的可执行文件放在某个地方(桌面是关于这种情况的正确位置)启用依赖项检查和一些其他次要属性。 然后构建项目C并运行安装程序(或使用上下文菜单从VS“安装”)。 现在您的应用程序和使用debug dll库创建的其他应用程序开始工作。
当你使用“删除”选项运行安装程序时要小心,你来到了以前的情况。 这是与分发主题相关的好文章: http : //blogs.msdn.com/b/vcblog/archive/2007/10/12/how-to-redistribute-the-visual-c-libraries-with-your-application .aspx 。
如果您有其他一些应用程序,并希望仅通过复制来部署它们,可能在没有安装VS的非开发机器上,您可以创建虚拟项目以及适当的配置和安装程序。 然后在每台计算机上安装一次,然后复制您正在处理的可执行文件。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.