问题
我写了一个名为' Foo'的C ++项目。在Windows XP Professional版本2002 Service Pack 3上使用Microsoft Visual Studio 2005 Verison 8.0.50727.762(SP.050727-7600)。我将项目构建到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
中的DLL和相应的清单文件重复此事。它也没有帮助。我得到了同样的错误。
在这两种情况下,我在事件查看器中都遇到以下错误&gt;系统
事件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和清单并没有修复它。
msvcm80.dll
,msvcp80.dll
和msvcr80.dll
Windows XP机器的C:\winnt\winsxs\x86_Microsoft.VC80.CRT_1fc8b3b9a1e18e3b_8.0.50727.762_x-ww_6b128700
(我开发并构建了foo.exe)
到{@ 1}}的Windows Server 2003(我试图运行foo.exe)。C:\foo
到C:\winnt\winsxs\Manifests\x86_Microsoft.VC80.CRT_1fc8b3b9a1e18e3b_8.0.50727.762_x-ww_6b128700.manifest
并将其重命名为C:\foo
。清单文件的第四行看起来像这样:
Microsoft.VC80.CRT.manifest
在尝试运行C:\ foo \ foo.exe时,我遇到了上一节中提到的相同错误。
从Visual Studio文件夹中复制CRT DLL和清单修复了它。
<assemblyIdentity type="win32" name="Microsoft.VC80.CRT" version="8.0.50727.762"
processorArchitecture="x86"
publicKeyToken="1fc8b3b9a1e18e3b"></assemblyIdentity>
,msvcm80.dll
,msvcp80.dll
和msvcr80.dll
从Windows XP计算机的Microsoft.VC80.CRT.manifest
(我开发并构建了foo.exe)复制到{{ 1)} Windows Server 2003计算机(我试图运行它)。清单文件的第四行看起来像这样:
C:\Program Files\Microsoft Visual Studio 8\VC\redist\x86\Microsoft.VC80.CRT
这次我可以毫无问题地运行C:\ foo \ foo.exe。
问题
我期待安装&#39; Microsoft Visual C ++ 2005 SP1可再发行组件&#39; (vcredist_x86.exe)如第二种方法中所述将修复它。但它没有。从开发计算机的C:\foo
文件夹中复制DLL和清单文件会修复它。为什么会这样?
构建选项
以防万一,它可以帮助您回答我的问题。以下是我从Visual Studio项目属性中选择的编译器和链接器选项:
配置属性&gt; C / C ++&gt;命令行:
<assemblyIdentity type="win32" name="Microsoft.VC80.CRT" version="8.0.50727.6195"
processorArchitecture="x86"
publicKeyToken="1fc8b3b9a1e18e3b"></assemblyIdentity>
配置属性&gt;链接器&gt;命令行:
C:\Program Files\Microsoft Visual Studio 8\VC\redist\x86\Microsoft.VC80.CRT
答案 0 :(得分:48)
我会回答我自己的问题。 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
中。所以,是的,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在a different answer中提到的这个问题,因为这是一个32位应用程序,所以必须在应用此应用程序的系统上安装vcredist_x86.exe(而不是vcredist_x64.exe)无论该系统是32位Windows系统还是64位Windows系统,都要运行。同样,.manifest文件在processorArchitecture
属性中提供了这个线索。
答案 1 :(得分:4)
以下是解决此问题的方法:
你将仍然得到sidebyside错误如果正在使用的应用程序是32位,你尝试在安装了VC_REDISTx64的64位操作系统上运行它。
简单的解决方案,您还必须在64位操作系统上加载VC_REDISTx86
答案 2 :(得分:3)
您必须安装“Microsoft Visual C ++ 2005 Service Pack 1可再发行组件包 MFC安全更新”,其中包含:http://www.microsoft.com/en-us/download/details.aspx?id=26347
答案 3 :(得分: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中的相应清单来解决了这个问题。
答案 4 :(得分:3)
虽然我的申请是
使用vs2008在Win 2k8 R2 x64上进行开发(在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)后,可以正确安装和运行应用程序。
答案 5 :(得分:0)
对我来说,并排错误只是通过更改设置下的c / c ++ - &gt;代码生成 - &gt; RuntimeLibrary,使其成为多线程调试的MTD
答案 6 :(得分:-2)
我们在这里确实存在以下问题:应用程序可执行文件使用清单机制引用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的非开发机器上,您可以创建虚拟项目以及适当的配置和安装程序。然后在每台计算机上安装一次,然后复制正在处理的可执行文件。