How To: インストーラーで Visual C++ 再頒布可能パッケージを インストールする

もし あなたのアプリケーションが Visual C++ ランタイムに依存しているなら、エンドユーザーの 為にインストール エクスペリエンスを簡素化するのに インストーラーの一部として それらを インクルードする事ができます。この How To は、Visual C++ ランタイム マージモジュールを インストーラーに包含する事と、あなたが見るであろう 予期される ICE warning の説明を 記述しています。

Step 1: 正式な Visual C++ ランタイム マージモジュールを 入手する

Visual C++ ランタイム マージモジュールは、Visual Studio と共にインストールされ、 \Program Files\Common Files\Merge Modules に置かれています。 Visual C++ 8.0 ランタイム ファイルは、Microsoft_VC80_CRT_x86.msm です。 この同じ MSM が Visual C++ 8.0 SP1 ランタイムの為に 用いられていますが、Visual Studio 2005 SP1 インストーラーによって 同じ場所でアップデートされています。Visual Studio 9.0 ランタイム ファイルは、Microsoft_VC90_CRT_x86.msm です。一般的に インストールの一部として policy MSM をインクルードする必要はありません。

Step 2: インストーラーに マージモジュールを インクルードする

インストーラーで マージモジュールを インクルードするには、 <Merge> <MergeRef> エレメントを使って下さい。以下の例は これらのエレメントが どのように使われるかを 説明しています。

<DirectoryRef Id="TARGETDIR">
    <Merge Id="VCRedist" SourceFile="MySourceFiles\Microsoft_VC80_CRT_x86.msm" DiskId="1" Language="0"/>
</DirectoryRef>
<Feature Id="VCRedist" Title="Visual C++ 8.0 Runtime" AllowAdvertise="no" Display="hidden" Level="1">
    <MergeRef Id="VCRedist"/>
</Feature>

Merge エレメントは、マージモジュールが 最終的な Windows Installer パッケージに インクルードされている事を 確実にします。ユニーク id が Id アトリビュートを使って 割り当てられています。SourceFile アトリビュートは、マシン上の マージモジュールの 位置を指し示しています。DiskId アトリビュートは、プロジェクトの Media エレメントで 指定された DiskId と一致しなければ なりません。Language アトリビュートは、常に 0 である べきです。

MergeRef エレメントは、実際にマージモジュールをインストールするのに Feature エレメント内で 使われています。上の例では、ランタイム固有の feature が作成され、あなたのインストーラーが 使う どの UI でも表示されないように hidden としてマークが付けられています。MergeRef は、 ユニーク id によって マージモジュールを参照します。

ICE warning についての覚え書き

Visual C++ ランタイム マージモジュールを インストーラーにインクルードする事で、 以下の ICE warning に帰着します:

light.exe(0,0): warning LGHT1076: ICE03: String overflow (greater than length permitted in column); Table: Component, Column: KeyPath, Key(s): downlevel_manifest.8.0.50727.762.98CB24AD_52FB_DB5F_FF1F_C8B3B9A1E18E
light.exe(0,0): warning LGHT1076: ICE03: String overflow (greater than length permitted in column); Table: Component, Column: KeyPath, Key(s): downlevel_manifest.8.0.50727.100.98CB24AD_52FB_DB5F_FF1F_C8B3B9A1E18E
light.exe(0,0): warning LGHT1076: ICE03: String overflow (greater than length permitted in column); Table: Component, Column: KeyPath, Key(s): downlevel_manifest.8.0.50727.101.98CB24AD_52FB_DB5F_FF1F_C8B3B9A1E18E
light.exe(0,0): warning LGHT1076: ICE03: String overflow (greater than length permitted in column); Table: Component, Column: KeyPath, Key(s): downlevel_manifest.8.0.50727.103.98CB24AD_52FB_DB5F_FF1F_C8B3B9A1E18E
light.exe(0,0): warning LGHT1076: ICE03: String overflow (greater than length permitted in column); Table: Component, Column: KeyPath, Key(s): downlevel_manifest.8.0.50727.104.98CB24AD_52FB_DB5F_FF1F_C8B3B9A1E18E
light.exe(0,0): warning LGHT1076: ICE03: String overflow (greater than length permitted in column); Table: Component, Column: KeyPath, Key(s): downlevel_manifest.8.0.50727.193.98CB24AD_52FB_DB5F_FF1F_C8B3B9A1E18E
light.exe(0,0): warning LGHT1076: ICE03: String overflow (greater than length permitted in column); Table: Registry, Column: Registry, Key(s): reg_downlevel_manifest.8.0.50727.100.98CB24AD_52FB_DB5F_FF1F_C8B3B9A1E18E
light.exe(0,0): warning LGHT1076: ICE03: String overflow (greater than length permitted in column); Table: Registry, Column: Registry, Key(s): reg_downlevel_manifest.8.0.50727.101.98CB24AD_52FB_DB5F_FF1F_C8B3B9A1E18E
light.exe(0,0): warning LGHT1076: ICE03: String overflow (greater than length permitted in column); Table: Registry, Column: Registry, Key(s): reg_downlevel_manifest.8.0.50727.103.98CB24AD_52FB_DB5F_FF1F_C8B3B9A1E18E
light.exe(0,0): warning LGHT1076: ICE03: String overflow (greater than length permitted in column); Table: Registry, Column: Registry, Key(s): reg_downlevel_manifest.8.0.50727.104.98CB24AD_52FB_DB5F_FF1F_C8B3B9A1E18E
light.exe(0,0): warning LGHT1076: ICE03: String overflow (greater than length permitted in column); Table: Registry, Column: Registry, Key(s): reg_downlevel_manifest.8.0.50727.193.98CB24AD_52FB_DB5F_FF1F_C8B3B9A1E18E
light.exe(0,0): warning LGHT1076: ICE03: String overflow (greater than length permitted in column); Table: Registry, Column: Registry, Key(s): reg_downlevel_manifest.8.0.50727.762.98CB24AD_52FB_DB5F_FF1F_C8B3B9A1E18E
light.exe(0,0): warning LGHT1076: ICE25: Possible dependency failure as we do not find CRT.Policy.63E949F6_03BC_5C40_FF1F_C8B3B9A1E18E@0 v in ModuleSignature table
light.exe(0,0): warning LGHT1076: ICE82: This action SystemFolder.98CB24AD_52FB_DB5F_FF1F_C8B3B9A1E18E has duplicate sequence number 1 in the table InstallExecuteSequence
light.exe(0,0): warning LGHT1076: ICE82: This action SystemFolder.98CB24AD_52FB_DB5F_FF1F_C8B3B9A1E18E has duplicate sequence number 1 in the table InstallUISequence
light.exe(0,0): warning LGHT1076: ICE82: This action SystemFolder.98CB24AD_52FB_DB5F_FF1F_C8B3B9A1E18E has duplicate sequence number 1 in the table AdminExecuteSequence
light.exe(0,0): warning LGHT1076: ICE82: This action SystemFolder.98CB24AD_52FB_DB5F_FF1F_C8B3B9A1E18E has duplicate sequence number 1 in the table AdminUISequence
light.exe(0,0): warning LGHT1076: ICE82: This action SystemFolder.98CB24AD_52FB_DB5F_FF1F_C8B3B9A1E18E has duplicate sequence number 1 in the table AdvtExecuteSequence

これらの warning は予期されており、Visual C++ マージモジュールが どのように書かれたのか によるものです。より詳しくは、 Aaron Stebner's blog entry を 見て下さい。

 

( 訳注: メモ を参照して下さい。)