読者です 読者をやめる 読者になる 読者になる

VS2005で最近ビルドしたC++のアプリが他環境だとサイドバイサイド云々で起動できない件

C++ VisualStudio

現象

Visual Studio 2005 にてC++で開発しているプロダクトがあります。最近、ある日を境に、開発環境で作成したビルドが、ターゲット環境で動作しなくなるという事象が発生しました。
具体的には、ある時期以降に作成したビルドを、ターゲット環境で実行しようとすると、下記のエラーが発生するようになりました。

このアプリケーションのサイド バイ サイド構成が正しくないため、アプリケーションを開始できませんでした。詳細については、アプリケーションのイベント ログを参照してください。

The application has failed to start because its side-by-side configuration is in
correct. Please see the application event log for more detail.

イベントログを確認すると、以下の記述があります。

"" のアクティブ化コンテキストの生成に失敗しました。 従属アセンブリ Microsoft.VC80.CRT,processorArchitecture="x86",publicKeyToken="1fc8b3b9a1e18e3b",type="win32",version="8.0.50727.6195" が見つかりませんでした。 詳細な診断を行うには sxstrace.exe を実行してください。

Activation context generation failed for "". Dependent Assembly Microsoft.VC80.CRT,processorArchitecture="x86",publicKeyToken="1fc8b3b9a1e18e3b",type="win32",version="8.0.50727.6195" could not be found. Please use sxstrace.exe for detailed diagnosis.

原因

どうやらビルド環境における Microsoft.VC80.CRT とやらのバージョンが上がってしまったことにより、それと同等のバージョンがインストールされていない環境では、サイドバイサイド(開発環境と同じバージョンのDLLを使用させる仕組み)により実行不能になってしまったようです。
ビルド環境における Microsoft.VC80.CRT とやらのバージョンが上がってしまった原因を調べたところ、下記のアップデートが原因のようでした。これは、Windows Updateにて勝手に導入されたものと思われます。

Microsoft Visual Studio 2005 Professional Edition - 日本語 用の Security Update (KB2538218)
この Security Update は Microsoft Visual Studio 2005 Professional Edition - 日本語 用です。
後で最新版の Service Pack をインストールした場合、この Security Update は自動的にアンインストールされます。
詳細については、http://support.microsoft.com/kb/2538218 を参照してください。

対処

1. 開発環境から当該アップデートをアンインストールする

KB2538218 を開発環境からアンインストールしてしまえば、以後のビルドからは今回の事象が発生しなくなります。

2. スタティックリンクする

今回の事象が発生するそもそもの要因は、Microsoft.VC80.CRT とやらのDLLのバージョンが開発環境と実行環境とで異なってしまうことです。
これをスタティックリンクするようにしてしまえば、バージョンの不一致などは発生しなくなります。
具体的には、プロジェクトのプロパティで、[C/C++]-[コード生成]-[ランタイムライブラリ]で、[マルチスレッド DLL (/MD)] の代わりに [マルチスレッド (/MT)] を選べばよいです。

ただし、共通言語ランタイムサポートを使うプロジェクトだと、上記設定をするとビルド不可能になってしまいます。

コマンド ライン error D8016 : コマンド ライン オプション '/MT' と '/clr' は同時に指定できません

この場合、本当に共通言語ランタイムサポートを使用しているプロジェクトであれば、回避は困難となるかもしれません。
ただ、もし共通言語ランタイムサポートを実際には使用していないプロジェクトの場合、プロジェクトのプロパティで、[構成プロパティ]-[全般]-[共通言語ランタイム サポート] を [共通言語ランタイム サポート (/clr)] から [共通言語ランタイム サポートを使用しない] に変更することで、ビルドが可能になります。