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

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

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

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

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

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

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

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

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

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

.NET Framework Extensionとは、.NET Frameworkを必要とするアプリのインストーラーで、

  • システムにインストールされている.NET Frameworkのバージョンを確認する
  • アプリが必要とするバージョンの.NET Frameworkのインストールする

などの実装を容易に実現するためのライブラリです。今回は、前者のバージョンを確認するための機能を利用します。

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

  1. .NET Framework Extensionへの参照を追加
  2. 名前空間の定義の追加
  3. 事前定義プロパテの参照を追加
  4. 前提条件を追加

なお、具体的な方法は、How To: Check for .NET Framework Versions(英語)に詳細があります。


1 .NET Framework Extensionへの参照を追加

.NET Framework Extension を使うためには、その実装モジュールであるWixNetFxExtension.dll をWiXプロジェクトに参照として追加する必要があります。なお、WixNetFxExtension.dll は、WiX toolset のインストーラーでインストールされます。

Extentionへの参照を追加するには、WiXのプロジェクトのReferencesのコンテキストメニューを開き、「参照の追加」を選択します。

参照の追加メニュー

すると、モジュール選択ダイアログが表示されます。

WiX toolset のインストーラーでインストールされるWixNetFxExtension.dll は、WiX toolset 3.11かつ64ビットWindowsであれば、

C:\Program Files (x86)\WiX Toolset v3.11\bin\

のフォルダーにインストールされています。ダイアログで上記のフォルダーを開き、WixNetFxExtension.dllファイルを選択して、[追加]ボタンで追加し、[OK]ボタンで確定します。

参照モジュールの選択ダイアログ

これで、.NET Framework Extensionの参照の追加は完了です。


2 名前空間の定義の追加

参照した.NET Framework ExtensionをXML内で使用するためには、まず、名前空間の定義を追加する必要があります。

XMLファイルのルートタグであるWixタグにnetfxの名前空間の定義を追加します。

xmlns:netfx="http://schemas.microsoft.com/wix/NetFxExtension"

この名前空間の定義を、下記の図の選択した部分のように追加します。

名前空間の定義を追加

これで名前空間を定義したnetfx:がXMLファイル内で使用できるようになります。


3 事前定義プロパテの参照を追加

.NET Framework Extensionでは、.NET Frameworkのインストール状態を表す定義済みのプロパティが多くあります。

すべてのプロパティのリストは、ここ(英語)に説明されています。

今回の機能に関連する一部のプロパティを抜粋します。これらのプロパティは、WiX v3.10以降で利用できます。

プロパティ名 意味
WIX_IS_NETFRAMEWORK_40_OR_LATER_INSTALLED .NET Framework 4.0以降がインストールされてるとき1が設定されます。
WIX_IS_NETFRAMEWORK_45_OR_LATER_INSTALLED .NET Framework 4.5以降がインストールされてるとき1が設定されます。
WIX_IS_NETFRAMEWORK_451_OR_LATER_INSTALLED .NET Framework 4.5.1以降がインストールされてるとき1が設定されます。
WIX_IS_NETFRAMEWORK_452_OR_LATER_INSTALLED .NET Framework 4.5.2以降がインストールされてるとき1が設定されます。
WIX_IS_NETFRAMEWORK_46_OR_LATER_INSTALLED .NET Framework 4.6以降がインストールされてるとき1が設定されます。
WIX_IS_NETFRAMEWORK_461_OR_LATER_INSTALLED .NET Framework 4.6.1以降がインストールされてるとき1が設定されます。WiX v3.11から利用できます。
WIX_IS_NETFRAMEWORK_462_OR_LATER_INSTALLED .NET Framework 4.6.2以降がインストールされてるとき1が設定されます。WiX v3.11から利用できます。

これらのプロパティは、対象のバージョン以降がインストールされていると1が設定されます。

これらのプロパティは、.NET Framework Extensionを参照するだけではまだ使えません。使いたいプロパティを宣言する必要があります。そのためには、WiX toolsetでは、PropertyRef タグを使います。PropertyRef タグの説明はここ(英語)にあります。それによると、FragmentタグProductタグの子供要素として

<PropertyRef Id="propertyId"/>

の定義をすれば使用したいプロパティを宣言できます。各設定値の意味は以下の通りです。

  • propertyId: 使用したいプロパティのIDを設定します。

今回は、.NET Framework 4.5以降がインストールされていることを表すプロパティを使用したいため、属性は以下のように設定します。

  • propertyId: WIX_IS_NETFRAMEWORK_45_OR_LATER_INSTALLED

実際のコードは以下のようになります。

<PropertyRef Id="WIX_IS_NETFRAMEWORK_45_OR_LATER_INSTALLED"/>

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

事前定義プロパティの参照を追加

4 前提条件を追加

最後に、前提条件を追加します。前回の投稿で説明した方法と同じです。

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

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

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

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

前回とは異なり、値の比較をする必要はありません。条件式に比較演算子なしにプロパティ名のみが出現した場合、プロパティが定義されていればTrue、定義されていなければFalseと評価されます。

WIX_IS_NETFRAMEWORK_45_OR_LATER_INSTALLEDプロパティは定義されていれば指定のバージョン以降がインストールされており、アプリのインストールを続けてよいことになります。そのめ、単純にプロパティ名を記述すればよいことになります。

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

実際のコードは以下のようになります。

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

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

前提条件を追加

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

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

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

コメントを残す