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

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

WiXを使って前提条件を実現する

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

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

各テーブルに設定すべき内容は前回の投稿で説明しました。直接テーブルを設定するのはかなり面倒です。

今回は、テーブルに情報を直接設定するのではなく、WiX toolsetおよびそのアドオンWiX toolset Visual Studio 201x Extensionを使った場合の設定方法です。

WiX toolsetを使う場合は、実現方法に二つあります。

  • 必要な各テーブルの情報をXMLで記述して実現する
  •  .NET Framework Extensionを使って最小限の記述で実現する

今回は、前者の方法で実現する方法を説明します。後者の方法で実現する方法は、次回に投稿します。

WiXプロジェクトは作成済みとしたとき、以下の手順で前提条件を追加します。

  1. レジストリ検索条件の追加
  2. 前提条件を追加

1 .レジストリ検索条件の追加

前々回の投稿で説明したように、.NET Framework のどのバージョンがインストールされているかはレジストリを参照すると判別できます。

また、前回の投稿で説明したように、最終的に前提条件を設定するためには、システムの状態(.NET Frameworkのインストール状態)を判別できる情報をプロパティに設定する必要があります。

レジストリを検索してプロパティを設定するには、WiX toolsetでは、RegistrySearch タグを使います。RegistrySearchタグの説明はここ(英語)にあります。それによると、FragmentタグProductタグの子供要素として

<Property Id="propertyName" Secure="secureValue">
  <RegistrySearch Id="idValue"
                  Key="keyValue"
                  Name="nameValue"
                  Root="rootValue"
                  Type="typeValue"/>
</Property>

の定義をすればプロパティにレジストリの値を設定できます。なお、このサンプルには、今回の目的の実現に不要な属性については記載を省略しています。各設定値の意味は以下の通りです。

  • propertyName: プロパティの名前を設定します。
  • secureValue: yes/noのいずれかを設定します。yesの場合、SecureCustomPropertiesプロパティにこのプロパティ名が設定されます。これにより、システムプロセスでもこのプロパティを参照できます。詳細は前回の投稿を確認してください。
  • idValue: レジストリ検索の項目に対してユニークな値を設定します。
  • keyValue: レジストリキーへのパスを設定します。
  • nameValue: レジストリキーの名前を設定します。
  • rootValue: レジストリのルートの種類(HKCR, HKCU, HKLM, HKU)を設定します。
  • typeValue: レジストリの値の種類(directory/file/raw)を設定します。

前回の投稿で説明したように.NET Framework 4.x 系のレジストリを参照するにはそれぞれの属性は以下のように設定します。

  • propertyName: REG_NET45_RELEASE
  • secureValue: yes
  • idValue: SIGNATURE_REG_NET45_RELEASE
  • keyValue: Software\Microsoft\NET Framework Setup\NDP\v4\Full
  • nameValue: Release
  • rootValue: HKLM
  • typeValue: raw

値は、前回の各種テーブルを直接設定するときと同じ値を使用しています。実際のコードは以下のようになります。

<Property Id="REG_NET45_RELEASE" Secure="yes">
  <RegistrySearch Id="SIGNATURE_REG_NET45_RELEASE"
                  Key="Software\Microsoft\NET Framework Setup\NDP\v4\Full"
                  Name="Release"
                  Root="HKLM"
                  Type="raw"/>
</Property>

この定義をProductタグの子供要素として追加します。


2 前提条件を追加

プロパティを参照して前提条件を設定するには、WiX toolsetでは、Condition タグを使います。Condition タグの説明はここ(英語)にあります。それによると、FragmentタグProductタグの子供要素として

<Condition Message="messageValue">
 <![CDATA[condition]]>
</Property>

の定義をすれば前提条件を設定できます。なお、このサンプルには、今回の目的の実現に不要な属性については記載を省略しています。各設定値の意味は以下の通りです。

  • messageValue: 条件を満たさなかった場合に表示するメッセージを設定します。
  • condition: 評価結果がTrueでなければならない条件式を設定します。条件式にはプロパティなどを参照できます。条件式の評価結果がFalseだった場合、メッセージを表示して、インストールを中断します。

.NET Framework 4.x 系のレジストリの値を設定したプロパティREG_NET45_RELEASE で条件を設定するにはそれぞれの属性は以下のように設定します。

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

値は、前回の投稿の各種テーブルを直接設定するときと同じ値を使用しています。実際のコードは以下のようになります。

<Condition Message="このアプリをインストールす前に、システムに.NET Framework 4.5またはそれ以降をインストールしてください。">
  <![CDATA[Installed OR REG_NET45_RELEASE >= "#378389"]]>
</Condition>

この定義をProductタグの子供要素として追加します。


以上により、定義は完了です。

後はWiXプロジェクトをビルドすれば完成です。

コメントを残す