デスクトップアプリのインストーラーで.NET Frameworkの条件を設定する2

WPFアプリ(.NET Frameworkアプリ)のインストーラーで、.NET Frameworkがインストールされていることを前提条件とする方法おいて、msiの各種テーブルの設定編です。

前提条件を実現する

前提条件を実現するためには、各種テーブルに情報を設定する必要があります。今回の目的である.NET Frameworkのインストール条件を設定するためには以下のテーブルを設定する必要があります。

  • RegLocatorテーブル
  • AppSearchテーブル
  • LaunchConditionテーブル
  • Propertyテーブル
  • InstallUISequence / InstallExecuteSequenceテーブル

各テーブルに設定すべき値を順番に説明します。

RegLocatorテーブル

Windows InstallerのリファレンスRegLocator Table(英語)によると

RegLocatorテーブルは、レジストリを使用してファイルまたはディレクトリを検索するため、または特定のレジストリエントリ自体を検索するために必要な情報を保持します。

とあります。したがって、RegLocatorテーブルには、レジストリのパス、キー、名前などの設定します。

テーブルのカラム(列)には、Signature_, Root, Key, Name, Type があり、各カラムは以下のように設定します。

  • Signature_: このRegLocatorテーブル内でユニークなキーを設定します。このキーはAppSearchテーブルから外部参照されます。
  • Root: 参照するレジストリーのルートキーの種類(HKCR/HKCU/HKLM/HKU)を設定します。HKEY_LOCAL_MACHINE(HKLM)の場合は、2となります。
  • Key: レジストリのキーを設定します。
  • Name: レジストリの名前を設定します。
  • Type: レジストリの値の種類を設定します。

.NET Framework 4.5以降を判定するためのレジストリを参照する場合(レジストリの詳細は前回の投稿を参照)は、以下の設定をします。

  • Signature_: SIGNATURE_REG_NET45_RELEASE
  • Root: 2
  • Key: Software\Microsoft\NET Framework Setup\NDP\v4\Full
  • Name: Release
  • Type: 2

AppSearchテーブル

Windows InstallerのリファレンスAppSearch Table(英語)によると

AppSearchテーブルには、特定のファイル署名を持つファイルを検索するために必要なプロパティが含まれています。 AppSearchテーブルを使用して、プロパティをレジストリまたは.iniファイルエントリの既存の値に設定することもできます。

とあります。
テーブルのカラム(列)には、Property, Signature_ があり、それぞれ以下のように設定します。

  • Property: 検索の結果を保存するプロパティ名を設定します。
  • Signature_: 検索条件を保持するテーブルの外部キーを設定します。外部キーはCompLocatorテーブル、RegLocatorテーブル、IniLocatorテーブル、DrLocatorテーブル、Signatureテーブルの順番に検索されます。

今回はレジストリを参照したいため、AppSearchテーブルには、RegLocatorテーブルの行(Row)の外部キー(Signature_)を設定します。

  • Property: REG_NET45_RELEASE
  • Signature_: SIGNATURE_REG_NET45_RELEASE

LaunchConditionテーブル

Windows InstallerのリファレンスLaunchCondition Table(英語)によると

LaunchConditionテーブルはLaunchConditionsアクションで使用されます。 これには、インストールを開始するためにすべて満たさなければならない条件のリストが含まれています。

とあります。
テーブルのカラム(列)には、Condition, Descriptionがあり、それぞれ以下のように設定します。

  • Condition: インストールを開始するためにTrueと評価さければならない条件式を設定します。
  • Description: 条件が満たされずにインストールを終了する必要がある場合に表示するローカライズ可能なテキストを設定します。

Conditionには、プロパティなどを参照した条件式が設定できます。プロパティ以外も参照できますが、今回はプロパティのみ参照します。条件式に使用できる値や演算子は、マイクロソフトのリファレンスConditional Statement Syntax(英語)を参照してください。

今回はREG_NET45_RELEASEプロパティが.NET Frameworkのバージョンを表す特定の値以上であることを条件とします。.NET Framework 4.5を示す値は、前回の投稿より、378389であることがわかります。

AppSearchテーブル・RegLocatorテーブルにより、レジストリから数値を取得した場合は、#数値 の形式で取得されます。そのため、このLaunchConditionテーブルには、以下のように設定します。

  • Condition: REG_NET45_RELEASE >= “#378389”
  • Description: このアプリをインストールす前に、システムに.NET Framework 4.5またはそれ以降をインストールしてください。

Propertyテーブル

Windows InstallerのリファレンスProperty Table(英語)によると

Propertyテーブルには、インストールで定義されているすべてのプロパティのプロパティ名と値が含まれています。 Null値のプロパティはテーブルに存在しません。

とあります。
テーブルのカラム(列)には、Property, Valueがあり、それぞれ以下のように設定します。

  • Property: 定義するプロパティ名を設定します。
  • Value: プロパティの値を設定します。

プロパティには、Windows Installer技術で定義されている特別なプロパティと開発者が自由に定義できるプロパティがあります。新しいプロパティを定義するときは、特別なプロパティと名前が重複しないようにします。

Windows Installer技術では、インストーラーは、ユーザープロセスとシステムプロセスの二つのプロセスが協調してインストールを行います。ユーザープロセスとシステムプロセスでプロパティの値を共有したい場合には、その共有したいプロパティ名を特別なプロパティであるSecureCustomPropertiesプロパティに;(コンマ)区切りで設定する必要があります。の詳細はマイクロソフトのレファレンスSecureCustomProperties(英語)を参照してください。

今回はこのSecureCustomPropertiesプロパティを設定します。REG_NET45_RELEASEプロパティをシステムプロセスでも参照できるようにするために以下のように設定します。

  • Property: SecureCustomProperties
  • Value: 既存の値;REG_NET45_RELEASE

InstallUISequence/InstallExecuteSequenceテーブル

Windows InstallerのリファレンスInstallUISequence Table(英語)およびInstallExecuteSequence Table(英語)によると

InstallUISequenceテーブルには、トップレベルのINSTALLアクションが実行され、内部ユーザーインターフェイスのレベルが「フルUI」または「縮小UI」に設定されているときに実行されるActionが一覧されます。 ユーザーインターフェイスレベルが「基本UI」または「UIなし」に設定されている場合、インストーラーはこのテーブルのActionをスキップします。

InstallExecuteSequenceテーブルには、トップレベルのINSTALLアクションが実行されたときに実行されるActionが表示されます。

とあります。

これらのテーブルにはインストール時に実行されるAction名、実行条件、順番が定義されています。Sequenceテーブル以外のテーブルに設定した情報は、これらのSequenceテーブルに設定されているActionから参照されます。Actionには、ビルトインアクションとカスタムアクションがあります。ビルトインアクションはWindows Installer技術で定義されているActionです。カスタムアクションは、開発者が定義したActionです。

テーブルのカラム(列)には、Action, Condition, Sequenceがあり、それぞれ以下のように設定します。

  • Action: 実行するアクションの名前を設定します。 ビルトインアクション、カスタムアクション、またはユーザーインターフェイスウィザードのいずれかの名前です。
  • Condition: アクションの実行条件式を設定します。 式がFalseと評価された場合、このアクションはスキップされます。
  • Sequence: 順序番号を設定します。この番号はこのアクションの実行順序の位置を決定します。

今回は、AppSearchテーブル、LaunchConditionテーブルに対応するビルトインアクションである、AppSearchアクション、LaunchConditionsアクションについて設定します。

AppSearchアクションの結果をLaunchConditionsアクションが参照するため、最低限、AppSearchアクションがLaunchConditionsアクションより先に実行される必要があります。そのためにAppSearchアクションのSequence番号がLaunchConditionsアクションのSequence番号より小さくなるように設定します。

しかし、ビルトインアクションについては、推奨されるSequence番号が決まっています。推奨されるSequence番号の詳細はSuggested InstallUISequence(英語)Suggested InstallExecuteSequence(英語)を参照してください。これによると推奨されるSequence番号はAppSearchアクションは400、LaunchConditionsアクションは100となっています。しかし、この値では上記の条件を満たしていません。そのため、LaunchConditionsアクションのSequence番号を410とします。

また、LaunchConditionsアクションは、アプリを新規インストールするときのみに実行され、更新やアンインストールのときにはスキップされる必要があります。そのため、LaunchConditionsアクションの実行条件には「Not Installed」を設定します。

ただし、すでにLaunchConditionsアクションが実行条件を指定せず使われている場合は、ここで「Not Installed」を設定してしまうと、LaunchConditionテーブル内の評価が必要な条件を評価せずスキップしてしまうことになります。その場合は、LaunchConditionsアクションには条件を設定せず、常に実行されるようにします。そしてLaunchConditionテーブル内の条件を「インストールされている、または」を追加します。具体的には、「REG_NET45_RELEASE >= “#378389″」であった場合、「Installed OR REG_NET45_RELEASE >= “#378389″」に変更します。

結果としてInstallUISequence/InstallExecuteSequenceテーブルには、以下のように設定します。

  • Action: AppSearch
  • Condition:
  • Sequence: 400
  • Action: LaunchConditions
  • Condition: Not Installed
  • Sequence: 410

このように、各種情報を各テーブルに設定することにより、.NET Framework 4.5がインストールされていることをインストールの前提条件とすることができます。

次回の投稿では、この条件について、WiX toolkitを使った場合の設定をしてみたいと思います。

2 Replies to “デスクトップアプリのインストーラーで.NET Frameworkの条件を設定する2”

コメントを残す