サイドバイサイド構成が正しくない ~アプリ起動時のエラー | 備忘録No.28のブログ

備忘録No.28のブログ

ブログの説明を入力します。

テーマ:
元々は研究部署だったので開発・実装寄りの部署へ異動後も動作要件など意識せず,VC2008でソフトウェアの実装してると以下のエラーが発生.

備忘録No.28のブログ-sidebyside

原因と対処について調べました.

<原因>
アプリケーションの中でどのdllを使うかの情報がある.
通常,実行ファイル(exeファイル)に埋め込まれるか,マニフェストファイルを出力(manifest形式)を出力し,同梱することで必要なランタイムdllを呼び出している.

上記をサイドバイサイド(開発環境と同じバージョンのdllを使用させる仕組み)という.
情報ソース はWikipedia(笑)

やっかいなのは,ビルド環境が自動で行われるWindows Updateによって書き換わるということ.
すなわち,開発者が意図せずしてサイドバイサイド構成が変わってしまい,動作条件が変わってしまう.
例えば…私自身が体験したのは,ビルドしたPC上のMicrosoft.VC90.CRTが最新版に更新されてしまい,常時Windows Updateがされている事務用のPC上では動作するものの,スタンドアローンで動かすPC(つまりWindows Updateが最新とは限らないPC)では動作せず,冒頭で書いたエラーが出る.

<対処>
動作させる環境(PC上)でまず,ソフトウェアが要求するMicrosoft.VC90.CRTのバージョンが存在するかどうかを確認する.
方法は,まずexeファイルをバイナリエディタで開く,あるいはマニフェストファイルをテキストエディタで開く.そうすると以下の情報が読めるはずです.

<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
 <dependency>
  <dependentAssembly>
   <assemblyIdentity type="win32" name="Microsoft.VC90.CRT" version="9.0.xxxxx.y" processorArchitecture="x86" publicKeyToken="1fc8b3b9a1e18e3b"></assemblyIdentity>
  </dependentAssembly>
 </dependency>
</assembly>


このうち,type, name, version, processorArchitecture, publicKeyToken,を手がかりにC:\Windows\winsxs\Manifests から該当フォルダ+ファイルが探せます.

→<無い場合>
(1)アップデートされた最新版の機能を使っているわけでなければ,ソフトウェアに埋め込まれた(またはマニフェストファイル)のMicrosoft.VC90.CRTの参照先をバイナリエディタで変更する.
(2)Windows Updateを実行し該当する環境を動作させるPC上へインストールする.

→<ある場合>
 この場合,exeファイルに埋め込まれておらずマニフェストファイルが無いと推測される.
 解決策としてはVCのプロジェクト上でマニフェストファイルを埋め込むようにするか,
 マニフェストファイルをexeファイルと同一フォルダへ置く.

<根本的な対策>
(1)VCの該当プロジェクトのプロパティを開き,
  [構成プロパティ]→[C/C++]→[コード生成]の[ランタイムライブラリ]の
  項目をMD(DLL)→MTへ変更する.
  ※[構成プロパティ]→[全般]の[共通言語ランタイムサポート]の
   項目を「しない」に設定必要
(2)他あるのかな?知識不足で何とも・・