問題
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 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.
[イベントビューアー]> [システム]で、3つのイベントがログに記録されました。
イベント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
に変更しました。マニフェストファイルの4行目は次のようになりました。
<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とマニフェストをコピーしても、修正されませんでした。
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を開発および構築した)マシンから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
に変更しました。マニフェストファイルの4行目は次のようになりました。
<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とマニフェストをコピーすると修正されました。
msvcm80.dll
、msvcp80.dll
、msvcr80.dll
、およびMicrosoft.VC80.CRT.manifest
を、Windows XPマシン(foo.exeを開発および構築した)のC:\Program Files\Microsoft Visual Studio 8\VC\redist\x86\Microsoft.VC80.CRT
からWindows Server 2003マシン(実行しようとしている)のC:\foo
にコピーしました。マニフェストファイルの4行目は次のようになりました。
<assemblyIdentity type="win32" name="Microsoft.VC80.CRT" version="8.0.50727.6195"
processorArchitecture="x86"
publicKeyToken="1fc8b3b9a1e18e3b"></assemblyIdentity>
今回は、問題なくC:\ foo\foo.exeを実行できました。
質問
2番目のアプローチで説明した「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再頒布可能パッケージMFCセキュリティアップデート をダウンロードし、C:\foo\foo.exe
を実行しようとしていたシステムにインストールしました。この後、EXEは正常に実行されました。
インストーラーは、CRT DLLをC:\windows\winsxs\x86_Microsoft.VC80.CRT_1fc8b3b9a1e18e3b_8.0.50727.6195_x-ww_44262b86
に配置しました。そう、はい、Hans Passantが正しく言ったように、8.0.50727.6195は私が探していたCRT DLLのバージョンでした。
このバージョンを理解する最も簡単な方法は、開発システムでプロジェクトをビルドするときに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が必要だった手がかりです。残りは、2番目の段落で言及したURLにある正しいvcredist_x86.exeを検索することでした。そのURLのページには、インストーラーによってインストールされるDLLのバージョン番号を示す KB2538242 へのリンクが含まれています。
注:Elieが 別の回答 でこの質問に言及したように、これは32ビットアプリケーションであるため、このアプリケーションが存在するシステムにvcredist_x86.exe(vcredist_x64.exeではない)をインストールする必要がありますそのシステムが32ビットWindowsシステムか64ビットWindowsシステムかに関係なく実行されることになっています。繰り返しますが、.manifestファイルはprocessorArchitecture
属性でこの手がかりを提供します。
ここにある「Microsoft Visual C++ 2005 Service Pack 1再頒布可能パッケージMFC Security Update」をインストールする必要があります: http:// www。 Microsoft.com/en-us/download/details.aspx?id=26347
この問題を修正する方法は次のとおりです。
[〜#〜] will [〜#〜] STILL使用するアプリケーションが32ビットで、VC_REDISTx64がインストールされている64ビットOSで実行しようとすると、サイドバイサイドエラーが発生します。
シンプルなソリューション、64ビットOSでVC_REDISTx86もロードする必要があります
多少関連する問題がありました。 2つの開発XP VS2005がインストールされたマシンをAとBと呼びます。Aで開発、ビルド、実行しました。その後、プロジェクト全体をBにコピーしました。そこでビルドしました。 SusamPalと同じエラーメッセージ:BのWinSxSには、x86_Microsoft.VC80.CRT_xxxマニフェスト(およびフォルダー)がありますが、対応するx86_Microsoft.VC80.DebugCRT_xxxのマニフェストはありません(そしてなぜ?!)。 SusamPalが説明していない呪文:AのWinSxSから適切なフォルダーをコピーし、WinSxs\Manifestsから適切なマニフェストをコピーすることで問題を解決しました。
私の申請は
developedvs2008を使用したWin 2k8 R2 x64(C:\ Program Files(x86)にmsvcm90.dll、msvcp90.dllおよびmsvcr90.dllがある) Microsoft Visual Studio 9.0\VC\redist\AMD64\Microsoft.VC90.CRT)
およびranwin 2k3 SP2 x64で、
ただし、msvcm80.dll、msvcp80.dll、msvcr80.dllが必要です。
インストール後 Microsoft Visual C++ 2005 SP1再頒布可能パッケージ(x86) を使用すると、アプリケーションをインストールして正しく実行できます。
私にとって、サイドバイサイドエラーは、c/c ++->コード生成->ランタイムライブラリの設定を変更するだけで、マルチスレッドデバッグであるMTDにする