Visual Studio 2008 SP1 のライブラリにバインドしたい

すでに Visual Studio 2008 には SP1 がリリースされているわけですが、SP1 をインストールした環境で
アプリケーションをビルドしても、埋め込みマニフェストに出力されるライブラリは Visual Studio 2008 RTM 版(9.0.21022.8)の
ままになっています。
この仕様が良いか悪いかの議論はあると思いますが、オプションを用いることで特定のライブラリにバインドさせることが
できます。

てっとり早く書いておくと、stdafx.h の先頭に

#define _BIND_TO_CURRENT_VCLIBS_VERSION 1

と追加しておくと、開発環境で使用しているライブラリのバージョンがマニフェストに記述されるというわけです。

#define _BIND_TO_CURRENT_VCLIBS_VERSION 1 の定義が無い場合

  <dependency>
    <dependentAssembly>
      <assemblyIdentity type=’win32′ name=’Microsoft.VC90.CRT’ version=’9.0.21022.8‘ …
    </dependentAssembly>
  </dependency>
  <dependency>
    <dependentAssembly>
      <assemblyIdentity type=’win32′ name=’Microsoft.VC90.MFC’ version=’9.0.21022.8‘ …
    </dependentAssembly>
  </dependency>

#define _BIND_TO_CURRENT_VCLIBS_VERSION 1 の定義がある場合

  <dependency>
    <dependentAssembly>
      <assemblyIdentity type=’win32′ name=’Microsoft.VC90.CRT’ version=’9.0.30729.1‘ …
    </dependentAssembly>
  </dependency>
  <dependency>
    <dependentAssembly>
      <assemblyIdentity type=’win32′ name=’Microsoft.VC90.MFC’ version=’9.0.30729.1‘ …
    </dependentAssembly>
  </dependency>

あとは使用するライブラリを再頒布すれば、期待した動作になると思います。
ただし、ATL プロジェクトの場合には注意が必要です。
Visual Studio 2008 SP1 で「_BIND_TO_CURRENT_VCLIBS_VERSION 1」がある場合でも
マニフェストには、9.0.30729.1 と 9.0.21022.8 の CRT にバインドするように作成してしまいます。

ATL プロジェクトの場合

#define _BIND_TO_CURRENT_VCLIBS_VERSION 1 の定義が無い場合

  <dependency>
    <dependentAssembly>
      <assemblyIdentity type=’win32′ name=’Microsoft.VC90.CRT’ version=’9.0.21022.8‘ …
    </dependentAssembly>
  </dependency>
  <dependency>
    <dependentAssembly>
      <assemblyIdentity type=’win32′ name=’Microsoft.VC90.ATL’ version=’9.0.21022.8‘ …
    </dependentAssembly>
  </dependency>

#define _BIND_TO_CURRENT_VCLIBS_VERSION 1 の定義がある場合

  <dependency>
    <dependentAssembly>
      <assemblyIdentity type=’win32′ name=’Microsoft.VC90.CRT’ version=’9.0.30729.1‘ …
    </dependentAssembly>
  </dependency>
  <dependency>
    <dependentAssembly>
      <assemblyIdentity type=’win32′ name=’Microsoft.VC90.ATL’ version=’9.0.30729.1‘ …
    </dependentAssembly>
  </dependency>
  <dependency>
    <dependentAssembly>
      <assemblyIdentity type=’win32′ name=’Microsoft.VC90.CRT’ version=’9.0.21022.8‘ …
    </dependentAssembly>
  </dependency>

いまいち、はっきりしない仕様ですが、結局のところ、Visual Studio 2008 SP1 でATL プロジェクトを作成したら、
9.0.30729.1 と 9.0.21022.8 の CRT を再頒布しないと動かないってことです。

2009 年もマイペースで更新しますので、よろしくお願いします。

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中

%d人のブロガーが「いいね」をつけました。