问题
我使用 Microsoft Visual Studio 2005 Version 8.0.50727.762 (SP.050727-7600) 在 Windows XP Professional Version 2002 Service Pack 3 上编写了一个名为 '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未解决问题。
- 从http://www.microsoft.com/download/en/details.aspx?id=3387下载vcredist_x86.exe
- 安装它。 安装程序创建了一个名为
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未解决问题。- 从http://www.microsoft.com/download/en/details.aspx?id=5638下载vcredist_x86.exe
- 安装它。 安装程序创建了一个名为
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和清单未解决问题。- 我将
C:\WINDOWS\WinSxS\x86_Microsoft.VC80.CRT_1fc8b3b9a1e18e3b_8.0.50727.42_x-ww_0de06acd
中的msvcm80.dll
,msvcp80.dll
和msvcr80.dll
复制到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文件和相应的清单文件再次重复了此操作,但仍然没有帮助。我得到了相同的错误。在这两种情况下,我在事件查看器 > 系统中获得了以下错误。
事件 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
从Windows XP机器(我开发和构建foo.exe的地方)复制到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
。
清单文件的第四行如下所示:
<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 计算机(我在那里开发和构建 foo.exe)的
C:\Program Files\Microsoft Visual Studio 8\VC\redist\x86\Microsoft.VC80.CRT
中的msvcm80.dll
、msvcp80.dll
、msvcr80.dll
和Microsoft.VC80.CRT.manifest
复制到试图在其中运行它的 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
C:\Foo\Release\Foo.exe.intermediate.manifest
。我已在下面的答案中详细说明了它。 - Susam Pal