Uncategorized

【T2-311補足】 msi ファイル (Windows Installer) の 64 bit 向けカスタマイズ

こんにちは。

Tech Ed 2009 セッション T2-311 で紹介が途中となった 64 ビット環境向けの msi のカスタマイズ手順、および紹介できなかったその他の要素について補足します。

msi ファイルの超概要

セッションでもご紹介したように、Windows インストーラの msi ファイルは、テーブルなどが多数含まれたデータベースファイルの構造になっています。
Visual Studio では、こうしたインストーラで必要となるテーブルの内容やプロパティなどの設定を簡素化しているため意識しませんが、msi ファイルの内容を細かくカスタマイズする必要が生じた場合にはこうしたテーブルの内容などをカスタマイズできるツールを使用して構成しなければならないケースがあります。

こうしたカスタマイズをおこなえるツールはいくつか存在しますが、ここでは、Windows SDK に付属の「Orca」というツールを使用して例示します。

カスタマイズの概要 (インストール ファイルの例)

では、実際に例をみてみましょう。(下記の例は、一見、64 bit とは無関係ですが、64 bit 環境のためのカスタマイズでも必要になる場合があります。)

例えば、ファイルのインストール先ディレクトリを変更する方法を考えてみましょう。この設定には、msi の中の File テーブル、Component テーブル、Directory テーブルなどを使用します。ここでは、インストールされるモジュール (.exe など) を c:\work のディレクトリにインストールするように変更してみましょう。

まず、Orca を起動して、Visual Studio などで作成された .msi ファイルを開いてください。
そして、File テーブルを参照すると、インストールされるモジュールの Component 名が Component_ 列 (下記) に記載されているのがわかります。

このコンポーネント名は Component テーブルで参照できます。さらに、Component テーブルの Directory_ 列にディレクトリ名が記載されていますので、つぎに、このディレクトリの情報を Directory テーブルで参照します。

Directory テーブルには、Directory 列、Directory_Parent 列、DefaultDir 列を持っており、それぞれ以下の内容が記載されています。

  • Directory 列 :
    その Directory の名前が入っています。
  • Directory_Parent 列 :
    親のディレクトリの名前 (上記) が入っています。ここをブランクにすると、親を持たないルートディレクトリであることを示します。
  • DefaultDir 列 :
    ここにディレクトリを指定します。一般に Directory_Parent に対するサブディレクトリを指定しますが、ターゲットディレクトリ (インストール先) とソースディレクトリ (インストール元) があり、それぞれをコロン (:) を使用して  targetpath:sourcepath の形式で指定します。(コロンを入れない場合には、双方のサブディレクトリになります。)

例えば、Visual Studio で作成したばかりの .msi ファイルは以下のような感じになっているでしょう。


上図で、パイプ文字 ( | ) で区切られている箇所は、short name と actual name を指しています。

上図では、約束語がたくさん含まれていますので注意してください。
まず、TARGETDIR ですが、ここには、インストーラ実行時に外部 (コマンドラインのオプションや、インストーラの画面) から指定するインストール先のターゲットディレクトリが設定されることを意味しています。また、SourceDir も、インストーラのソースディレクトリのパスで上書きされます。さらに、ショートカットの作成などで使用するプログラムメニュー (ProgramMenuFolder) やデスクトップ (DesktopFolder) のディレクトリなども上記で指定されていますが、これらもそれぞれの環境にあわせて書き換えられます。(なお、作成されるショートカットは、上記の File テーブルでなく、Shortcut テーブル内で指定されています。)

これらの詳細については、以下に記載されています。

Using the Directory Table :
http://msdn.microsoft.com/en-us/library/aa372452(VS.85).aspx

今回は、c:\work にインストールするため、この Directory テーブルに [Add Row] メニューで行を追加し、以下の 2 行を追加してみましょう。

DirecroryDirectory_ParentDefaultDir
root(ブランク)SourceDir
workrootwork:.

1 行目は、ルートドライブ (この場合、C: と仮定) がターゲットとして設定され、2 行目で c:\work がターゲットに指定されます。

あとは、この「work」を Component テーブルの Directory_ 列に設定して終了です。

上記は 64 bit とは何ら関係のないサンプルでしたが、例えば、x86 用と x64 用でインストールするモジュールを変える場合には、Directory テーブルで x86 用と x64 用の両方のソースの指定を用意しておき (さらに、それぞれを同じターゲットにインストールするように設定し)、Component テーブルの Condition 列を使用してコンポーネントのインストール条件を設定することで、環境にあわせてそれぞれ別のソースからコピーをおこなうように指定することになるでしょう。

64 bit 用のカスタム動作の設定 (マネージコードの場合)

では、デモでさらりと流した「64 bit 環境用のカスタム動作の設定手順」を復習し、紹介できなかった他の設定方法などもご紹介します。

カスタム動作 (カスタムアクション) は、ご紹介したように CustomAction テーブルに記載されており、インストール時、アンインストール時などの各アクションと、アクションで使用するソース (Source) が下記の通り指定されています。

そして、上記の Source の情報は Binary テーブルに記述されており (下図)、下記の Data 列に、実行されるバイナリ データが入っています。

セッション(デモ)で見ていただいたように、マネージコードのアクションの場合、既定では、このバイナリデータとして、

%windir%\Microsoft.NET\Framework\v2.0.50727\InstallUtilLib.dll

が設定されています。このため、カスタム動作を動かすと、ファイルはリダイレクトされたり、32 bit 用の ngen.exe が実行されるなど、64 ビット環境にあわない動きをすることになるでしょう。(ご紹介したように、Visual Studio のコマンドプロンプトも 32 bit 用の Framework にパスが通っていますので混乱しないよう注意してください。Visual Studio 2010 がどうなるかは、現時点では未定です。)

従って、Orca を使用して、この Binary Data を 64 bit 用の

%windir%\Microsoft.NET\Framework64\v2.0.50727\InstallUtilLib.dll

に変更することでこれらは解決されます。

セッションのデモでは上記の方法を紹介しましたが、例えば、アクションによって 32 bit, 64 bit をわけて実行したい場合などには Binary テーブルの行を追加して、CustomAction テーブルで使用する Binary を用途にわけて設定すれば双方のアクションを実行することもできます。

 

Categories: Uncategorized

2 replies»

  1. 本題とは直接関係ないところを。。。
    Directory Table の root 要素は、そのまま TARGETDIR を使います。
    なので、この場合、work は
    work TARGETDIR … となります。
    ついでに DefaultDir も。
    こちらは Target:Source という構成になっていて
    Target, Source とも ShortName|LongName という形をとります。
    ただし、Target=Source の場合、ソースは省略可能です。
    また、ShortName|LongName も同じになる場合(8.3の命名規約に準拠した名前を使っている場合)は、LongNameだけでOKとなります(大文字小文字を区別して名前をセットします)。
    ちなみに、この命名規約は、File Table の FileName でも同じです。
    なお、DefaultDir の場合だけ、’.'(=カレントではなく親と一緒)という特殊なディレクトリ名がつけられます。

    Like

Leave a Reply