「ソフテックだより」では、ソフトウェア開発に関する情報や開発現場における社員の取り組みなどを定期的にお知らせしています。
さまざまなテーマを取り上げていますので、他のソフテックだよりも、ぜひご覧下さい。
ソフテックだより(発行日順)のページへ
ソフテックだより 技術レポート(技術分野別)のページへ
ソフテックだより 現場の声(シーン別)のページへ
私はソフテックに入社して3年目になる社員です。
先日、既存のインストーラーにカスタム動作追加の必要がある案件に携わりましたので、セットアッププロジェクトでカスタム動作を追加する手順についてご紹介させていただきます。
現在VisualStudioでインストーラーを作成する一般的な方法は、セットアッププロジェクトを用いる方法だと思います。
現在までの経緯をたどってみると、以前から"Visual Studio Installer"というツールが MSサイトより配布されていましたが、VisualStudio2012から一旦サポートがなくなりました。
VisualStudioで作成したアプリの配布には、InstallerShieldやInnoSetupなど様々なツールが存在しますが、デメリットもあるため"Visual Studio Installer"復活の声が多く、VisualStudio2013で復活し、現在も一般的に使用されています。
では、本題のカスタム動作を含むインストーラーの作成手順についてご紹介していきます。
今回は例として、
@標準インストーラーの作成
A動作モード選択画面の追加
B設定ファイル選択画面の追加
の3点についてご紹介します。
まずは、インストールするのみの標準的なインストーラーを作成します。
標準インストーラーの作成手順については、様々なサイトで説明されているので本稿では手短に説明します。
Application Folderの他にファイルシステムに表示されているUsers’ Desktopはデスクトップに、Users Programs Menuはスタートメニューにショートカットを作成するためのフォルダです。
追加する場合は、Application Folderのプライマリ出力右クリック→Create Shortcut to〜選択→作成したショートカットをUsers’ Desktop、Users Programs Menuに移動すればOKです。
ここまで来たら、インストーラープロジェクトをビルドしてみてください。作成されたインストーラーを実行すると見慣れたインストーラーが起動するはずです。
インストーラー作成にあたり、言語選択やライセンス契約の同意など前項で作成したインストーラーに機能を追加したい場合があると思います。
そこで今回は、インストーラーに動作モード選択を追加する方法を例に、カスタム方法について説明していきます。
はじめにモード選択機能の追加ですが、下記2つの手順が必要です。
・モード選択するUI作成(ユーザーインターフェースの追加)
・UIでの選択内容をインストーラーに紐づける(カスタム動作の追加)
各手順について詳しく説明していきます。
ユーザーインターフェースの追加により、インストーラーと同じデザインの画面を追加することが可能になります。自由度が低いのが難点ですが、モードを選択するといった単純な画面であれば十分対応可能です。
@3.1で作成したセットアッププロジェクトを右クリック
AViewを選択
Bユーザーインターフェースを選択
CStart、Progress、EndからUIを追加したいタイミングを右クリック
Dダイアログの追加を選択
下図画面が表示されます。
図 1. 追加UI選択画面
今回は2つのモードから起動時の動作モードを選択したいので、Start時に「オプションボタン(2ボタン)」を追加しました。
また、各UIの表示順はUIの右クリックから変更が可能です。
今回は「ようこそ」の後に表示するようにしました。
図 2. UI追加後の構成
次に追加したUIの各プロパティを設定します。
プロパティ名 | 概要 | 今回の設定値 |
---|---|---|
BannerBitmap | ダイアログの上部に表示する画像 | (Default) |
BannerText | バナーに表示するテキスト | 初期動作モードの選択 |
BodyText | 画面に表示するテキスト | 次のモードで使用します |
Button1Label | 1つ目のラジオボタンのテキスト | モード1 |
Button1Value | 1つ目のラジオボタンの値 | 1 |
Button2Label | 2つ目のラジオボタンのテキスト | モード2 |
Button2Value | 2つ目のラジオボタンの値 | 2 |
ButtonProperty | カスタム動作との連動に使用 ※詳細は後述します |
MODE |
DefaultValue | 初期選択状態の設定 | 1 |
ここまででUIの追加は完了です。
図 3. 初期動作モード選択UI
次に、作成したUIの選択内容を取得して実際の処理(今回であれば選択モードで起動するようにIniファイルを書き換え)を追加します。
はじめに、カスタム動作用のプロジェクトを作成します。
◆プロジェクト作成
@インストーラーのソリューション内に新しいプロジェクトを追加し、クラスライブラリを選択します(名称はInstall Custom Actionとしました)
A「System.Configuration.Install」の参照を追加
BInstallerクラスの派生クラスを作成し、Run Installer Attribute属性をtrueで追加
図 4. Installerクラスの派生クラス
これでカスタム動作用のプロジェクトが作成できました。
次にこのプロジェクトをカスタム動作に追加します。
◆カスタム動作追加手順
@3.1で作成したセットアッププロジェクトを右クリック
AViewを選択
BInstall、Commit、Rollback、Uninstallから追加したいタイミングを右クリック
(今回はCommit)
Cカスタム動作の追加を選択
DApplication Folderに先ほど作成したプロジェクト(Release)を追加
E追加したプロジェクトを選択してOK
図 5. カスタム動作追加後の構成
これで、モード選択画面を表示できるようになりました。
次に、ユーザーが選択した内容を取得していきます。
今回必要なのは、インストール先のパスと選択モードの2つのデータです。データの受け渡しには「Custom Action Data」を使用します。
追加したカスタムアクションのプロパティウインドウから「Custom Action Data」に、下記ルールに則り記述していきます。
〇記述ルール
・Windows Installerのプロパティは[]で囲む
・値にスペースが含まれる時は“”で囲む
・データが複数ある場合は、半角スペースで区切る
(私は↑に気付かず、詰まりました…)
今回は、インストール先のパスをdir、選択モードをmodeとしたので
「/dir="[TARGETDIR]\" /mode=MODE」となります。
ここで、先述のUIのプロパティ「Button Property」の出番があるということです。
“/”の後ろが変数名になるので、「/type=1」のように任意の値を渡すことも可能です。
ここまで来たら、実現したい処理を書いていくのみです。
今回はインストールが完了時(Commit)にカスタム動作を追加したので、Installerクラスのコミット時イベントに処理を記載していきます。
渡したデータは下記のようにしてInstaller派生クラスで使用することができます。
<C#>
int mode = int.Parse(this.Context.Parameters["mode"]);
string targetdir = this.Context.Parameters["dir"];
後は、この値を利用してIniファイルの書き換えなど必要な処理を記載していけばOKです。
ここまででユーザーインターフェースは追加できたわけですが、図1にあるように、ユーザーインターフェースは固定の14種類から選択するしかありませんでした。
しかし、実際には固定のフォーマットにとらわれない機能を追加したい場合もあると思います。
そこで、本項ではユーザーインターフェースの追加では実現できそうにない、フォルダ選択画面の追加方法を説明していきます。
固定14種以外を追加するには、カスタム動作用のプロジェクトにフォームを追加して対応します。
ユーザーインターフェースの追加と異なる点は、インストーラー自体のUIではないため、インストーラー画面の上にダイアログが表示されるようになります。
今回は下図ダイアログを作成しました。(インストーラーUIデザインとは異なってしまうのが少し気になるところですが…)
図 6. インポートフォルダ選択画面
カスタム動作クラスで対応することで、カスタム動作で受け取ったデータによって処理を変えることも容易です。例えば今回の場合だと、選択モードによって表示するダイアログを変えるといったことが実現可能です。
このように固定フォームで対応できる場合はユーザーインターフェースの追加、難しい場合はフォーム作成と使い分けることで様々な機能を追加することができます。
今回は備忘録も兼ねて、セットアッププロジェクトでインストーラーをカスタムする方法についてご紹介させていただきました。
作成してみた正直な感想は、結構手間がかかるということです。
やりたいことは単純なのに、調査や試行錯誤に思ったよりも時間がかかりました。
InstallShieldを使用すると自由度の高いインストーラーを作成できるようですが、価格面やライセンス条件の厳しさから、セットアッププロジェクトで作成したいということが多いのではないでしょうか。その際に本稿が少しでもお役に立てれば幸いです。
最後までお読みいただき、ありがとうございました。
(Y.M.)
関連ページへのリンク
関連するソフテックだより