.NET9のWPFアプリを爆速で作る　インストーラー編

## 概要
Windowsアプリのインストーラーを`Microsoft Visual Studio Installer Projects 2022`で作ります。
以下の利点があります。
- リポジトリにインストーラーのソースコードを含めることができる
- ランタイムの配布が容易になる

## サンプルコード
https://github.com/umbreon-nu/fluent-app-win

## 方法
### 拡張機能の追加
Visual Studio 2022のメニューバー > 拡張機能 > 拡張機能の管理 より、
`Microsoft Visual Studio Installer Projects 2022`
をインストールします。
![スクリーンショット 2025-02-26 225252.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3722996/e8b62e9f-3925-4f25-ab00-adfee203ec1b.png)

### Setup Projectの追加
Setup Projectをソリューションに追加します。
![スクリーンショット 2025-02-27 215834.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3722996/0cdd1c2b-4710-432c-a8a5-c23da7a8f7f1.png)

### インストール対象のアプリケーション指定
プロジェクトを右クリックし、View > ファイルシステム を選択します。
Application Folder を右クリックし、Add > プロジェクト出力 を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3722996/5f2ec064-c700-4062-aaa2-db4d5cc1204a.png)

PublishItemsOutputGroup を選択します。
![スクリーンショット 2025-02-27 221909.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3722996/1255328a-eaf5-497c-82d0-a8b6f4df6440.png)

デスクトップショートカットとスタートメニューに表示するアイコンもApplication Folderに追加しておきます。
Application Folder を右クリックし、Add > ファイル を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3722996/c2316ad3-0c79-4699-8169-e3de0e3a8a9f.png)

リポジトリに含まれるicoファイルを選択し、Application Folderに追加します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3722996/10e380ca-8eb8-4aa7-9d4a-57d4712c8574.png)

### デスクトップショートカットの作成
User's Desktop の右側部分を右クリックし、新しいショートカットの作成を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3722996/6ace3f4e-d391-468f-9853-447aceedcc3f.png)

Application FolderのPublishItemsOutputGroupを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3722996/99a6fb57-281e-4554-8b6e-5b4c5ff97543.png)

プロパティウィンドウより、Nameを変更し、Iconを指定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3722996/c6e146c2-b81d-4278-9f68-5c70c5d2bf1f.png)

### スタートメニューの作成
デスクトップショートカットと同じように、新しいショートカットを作成します。
スタートメニューをフォルダ階層化させたい場合は、User's Programs Menuを右クリックし、Add > Folder でフォルダを作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3722996/1e9172dd-f543-4f8e-8e65-7a47ef570bd0.png)

あとは同じ要領でショートカットを作成、Nameを変更、Iconの指定をします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3722996/196bf534-7ff0-4f1a-a976-38f51bdc0286.png)

### ランタイムの配布
プロジェクトを右クリックし、プロパティ > Prerequisites より必須コンポーネントを選択します。
サンプルアプリは .NET9のWPFアプリ（x64）なので、`.NET デスクトップ ランタイム 9.0.2 (x64)`を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3722996/3803e6d8-c899-4fa1-97f6-33629e913b4e.png)

### インストーラーのUI設定
プロジェクトを右クリックし、View > ユーザーインターフェース を選択します。
ダイアログの順番を入れ替えたり、プリセットされたダイアログを追加できます。
今回はStart時にライセンス条項を加えます。

Startを右クリックし、ダイアログの追加 を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3722996/e5474486-c8e0-4454-ba95-47101cd0c906.png)

ライセンス条項を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3722996/bc57c6a4-d74f-4c91-b959-f722ca7e4b33.png)

「ようこそ」と「インストールフォルダ―」の間に持っていきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3722996/ddc50abb-b424-4f50-8520-86184aec452f.png)

「ライセンス条項」を右クリックし、プロパティウィンドウを選択します。
LicenseFileを選択します。リッチテキスト形式のみサポートしているようですので、Iconの追加と同じ手順で設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3722996/4f2f9f5f-040d-4907-8113-dc39bb28a919.png)

「Administrative Install」も同様にします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3722996/7a8079f7-18ff-46e5-bd6d-5fce72ceb98c.png)

### インストーラーのプロパティ設定
プロジェクトを選んだ状態で、メニューバー > 表示 > プロパティウィンドウ より、各種プロパティを設定できます
![スクリーンショット 2025-02-27 221052.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3722996/4648d840-7eed-401a-8c0a-d0503cf8f48a.png)

### インストーラーのビルド
プロジェクトをビルドすることで、`setup.exe`と`*.msi`が生成されます。
この2つのファイルを配布し、setup.exeを起動することでインストーラーが起動します。

## おわりに
今回紹介したもの以外にも、インストール時に値をレジストリに書き込んだり、カスタムアクションを追加したりできます。
また、GitHub Actionのワークフロー等でCI/CDを容易に実現でき、開発コストの低減にもつながるかもしれません。