繁体   English   中英

当我在一台机器上开发EXE并在另一台机器上运行它时,为什么安装vcredist_x86.exe不会修复SideBySide错误?

[英]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没有修复它

  1. http://www.microsoft.com/download/en/details.aspx?id=3387下载了vcredist_x86.exe
  2. 安装好了。 安装程序创建了一个名为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没有修复它

  1. http://www.microsoft.com/download/en/details.aspx?id=5638下载了vcredist_x86.exe
  2. 安装好了。 安装程序创建了一个名为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和清单并没有解决它。

  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机器(我构建EXE)复制CRT DLL和清单并没有解决它。

  1. 我将Windows XP机器(我开发并构建了foo.exe)的C:\\winnt\\winsxs\\x86_Microsoft.VC80.CRT_1fc8b3b9a1e18e3b_8.0.50727.762_x-ww_6b128700msvcm80.dllmsvcp80.dllmsvcr80.dll复制到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 (我在哪里开发并构建了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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM