web-dev-qa-db-ja.com

あるマシンでEXEを開発して別のマシンで実行すると、vcredist_x86.exeをインストールしてもSideBySideエラーが修正されないのはなぜですか?

問題

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をインストールしても修正されませんでした

  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_0de06acdからC:\fooにコピーしました。
  2. 次に、C:\WINDOWS\WinSxS\Manifests\x86_Microsoft.VC80.CRT_1fc8b3b9a1e18e3b_8.0.50727.42_x-ww_0de06acd.manifestC:\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とマニフェストをコピーしても、修正されませんでした。

  1. msvcm80.dllmsvcp80.dllmsvcr80.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にコピーしました。
  2. 次に、C:\winnt\winsxs\Manifests\x86_Microsoft.VC80.CRT_1fc8b3b9a1e18e3b_8.0.50727.762_x-ww_6b128700.manifestC:\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とマニフェストをコピーすると修正されました。

  1. msvcm80.dllmsvcp80.dllmsvcr80.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

41
Susam Pal

私自身の質問に答えます。 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属性でこの手がかりを提供します。

50
Susam Pal

ここにある「Microsoft Visual C++ 2005 Service Pack 1再頒布可能パッケージMFC Security Update」をインストールする必要があります: http:// www。 Microsoft.com/en-us/download/details.aspx?id=26347

4
Weisheng Liu

この問題を修正する方法は次のとおりです。

[〜#〜] will [〜#〜] STILL使用するアプリケーションが32ビットで、VC_REDISTx64がインストールされている64ビットOSで実行しようとすると、サイドバイサイドエラーが発生します。

シンプルなソリューション、64ビットOSでVC_REDISTx86もロードする必要があります

4
Elie

多少関連する問題がありました。 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から適切なマニフェストをコピーすることで問題を解決しました。

3
user1752563

私の申請は

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) を使用すると、アプリケーションをインストールして正しく実行できます。

3
superlee

私にとって、サイドバイサイドエラーは、c/c ++->コード生成->ランタイムライブラリの設定を変更するだけで、マルチスレッドデバッグであるMTDにする

0
shivi