42

問題

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; ソース: サイドバイサイド

Dependent Assembly Microsoft.VC80.CRT could not be found and Last Error was
The referenced assembly is not installed on your system.

イベント ID: 59; ソース: サイドバイサイド

Resolve Partial Assembly failed for Microsoft.VC80.CRT.
Reference error message: The referenced assembly is not installed on your system.

イベント ID: 59; ソース: サイドバイサイド

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.dllおよびmsvcr80.dllから C:\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_6b128700DLLと対応するマニフェスト ファイルを使用して、このことをもう一度繰り返しました。それも役に立ちませんでした。同じエラーが発生しました。

どちらの場合も、[イベント ビューアー] > [システム] で次のエラーが表示されました。

イベント ID: 34; ソース: サイドバイサイド

Component identity found in manifest does not match the identity of the component requested

イベント ID: 58; ソース: サイドバイサイド

Syntax error in manifest or policy file "C:\foo\Microsoft.VC80.CRT.MANIFEST" on line 4.

イベント ID: 59; ソース: サイドバイサイド

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.exemsvcm80.dllを開発およびビルドした場所) からWindows Server 2003 (foo.exe を実行しようとしている場所) にコピーしました。msvcp80.dllmsvcr80.dllC:\winnt\winsxs\x86_Microsoft.VC80.CRT_1fc8b3b9a1e18e3b_8.0.50727.762_x-ww_6b128700C:\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 を実行しようとすると、前のセクションで説明したのと同じエラーが発生しました。

CRT DLL とマニフェストを Visual Studio フォルダーからコピーすると修正されました。

  1. msvcm80.dll、およびWindows XP マシン (foo.exe を開発およびビルドした場所) からWindows msvcp80.dllServer 2003 マシン (実行しようとしている場所) にコピーしました。msvcr80.dllMicrosoft.VC80.CRT.manifestC:\Program Files\Microsoft Visual Studio 8\VC\redist\x86\Microsoft.VC80.CRTC:\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

4

7 に答える 7

52

私は自分の質問に答えます。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 は、Hans Passant が正しく言ったように、私が探していた 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_x64.exe ではなく) vcredist_x86.exe をインストールする必要があります。そのシステムが 32 ビット Windows システムか 64 ビット Windows システムか。繰り返しますが、.manifest ファイルは、processorArchitecture属性でこの手がかりを提供します。

于 2012-01-19T10:44:28.100 に答える
4

http://www.microsoft.com/en-us/download/details.aspx?id=26347にある「MicrosoftVisualC++ 2005 ServicePack1再頒布可能パッケージMFCセキュリティ更新プログラム」をインストールする必要があります。

于 2012-05-17T14:38:42.047 に答える
4

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

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

簡単な解決策です。64 ビット OS では VC_REDISTx86 もロードする必要があります。

于 2012-11-21T18:37:21.933 に答える
3

私のアプリケーションは

vs2008 (C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\redist\amd64\Microsoft.VC90.CRT に msvcm90.dll、msvcp90.dll、msvcr90.dll がある) を使用して Win 2k8 R2 x64 で開発

win 2k3 SP2 x64で実行し、

ただし、msvcm80.dll、msvcp80.dll、および msvcr80.dll が必要です。

Microsoft Visual C++ 2005 SP1 Redistributable Package (x86)をインストールすると、アプリケーションを正しくインストールして実行できます。

于 2012-10-30T07:35:19.667 に答える
3

やや関連する問題がありました。VS2005 がインストールされた 2 台の開発用 XP マシンを A と B と呼びます。A で開発、ビルド、実行しました。次に、プロジェクト全体を B にコピーしました。そこでビルドしました。実行しようとしましたが、SusamPal と同じエラー メッセージが表示されました。B の WinSxS には x86_Microsoft.VC80.CRT_xxx マニフェスト (およびフォルダー) があるが、対応する x86_Microsoft.VC80.DebugCRT_xxx マニフェスト (およびなぜ?!) がないことに気付きました。SusamPal によって説明されたいくつかのダンスと呪文を試しましたが、役に立ちませんでした。A の WinSxS から B に適切なフォルダーをコピーし、WinSxs\Manifests から適切なマニフェストをコピーして、問題を解決しました。

于 2012-10-17T09:03:31.010 に答える
0

私にとっては、サイドバイサイドエラーは、設定の下で c/c++ ->CodeGeneration->RuntimeLibrary を変更するだけで発生し、マルチスレッドデバッグである MTD にします。

于 2014-06-03T19:03:57.183 に答える
-2

ここで実際に次の問題があります。アプリケーションの実行可能ファイルは、マニフェスト機構を使用して dll を参照します。昔、アプリケーションの作成者は、必要な dll をシステム ディレクトリにコピーしただけでした。残念なことに、これはいわゆる「dll 地獄」の問題を引き起こし、古い dll バージョンを互換性のない新しいバージョンで上書きすると、アプリケーションが動作しなくなる可能性がありました。その後、MS はバージョン管理のアイデア (winsxs) を思いつきました。

残念ながら、これは非常に複雑な機構であり、dll (アセンブリ) を sxs フォルダーに手動でインストールすることは絶対にお勧めできません。いわゆる「再配布可能パッケージ」をインストールすることも、完璧な解決策ではありません。

さらに、これはデバッグ バージョンが必要な場合には役に立ちません。MS は、サポートする dll のデバッグ バージョンの配布を禁止しているため、「再配布可能なパッケージ」はそれらをインストールしません。(アセンブリ ID は VS2005 の現在のサブバージョンに依存し、インストールされているサポート ライブラリに関連していることに注意してください。)

通常、VS インストーラーは必要なアセンブリをシステムに追加しますが、しばらくしてから更新プログラムまたは新しい SDK とツールをインストールすると、この正しい状態が損なわれる可能性があります。

このような状況にあるとしましょう - デバッグ ライブラリがシステムに統合されていません。プロジェクト A のワークスペースとアクティブなデバッグ構成を与え、アプリケーションが機能しないとします。次に、現在のワークスペースで C などのインストーラー プロジェクトを作成し、アプリケーション (厳密には、アクティブな構成を持つプロジェクト) を追加します。インストーラー プロジェクトをセットアップして、実行可能ファイルをどこかに配置します (この状況ではデスクトップが適切な場所です)。依存関係のチェックとその他のいくつかのマイナー プロパティを有効にします。次に、プロジェクト C をビルドし、インストーラーを実行します (または、コンテキスト メニューを使用して VS から「インストール」します)。これで、デバッグ DLL ライブラリで作成されたアプリケーションとその他のアプリケーションが動作し始めます。

「削除」オプションを指定してインストーラーを実行すると、以前の状況になることに注意してください。配布のトピックに関連する良い記事は次のとおりです。 .aspx .

他のアプリケーションがいくつかあり、それらを単にコピーするだけでデプロイしたい場合、おそらく VS がインストールされていない非開発マシンに、適切な構成とインストーラーと共にダミー プロジェクトを作成することができます。次に、各マシンに一度インストールしてから、作業中の実行可能ファイルをコピーします。

于 2015-06-28T13:00:55.650 に答える