Visual Studio 2019 × WiXToolSet を用いてインストーラを作成する

# はじめに
サービスプログラムをインストーラーとして配布する必要があり、
インストーラの作成にあたり、WiXToolSetを用いて作成を行いましたので備忘録として記載を行います。
（拙い文章・説明となりますがおおらかな目で見ていただけると幸いです）

# 準備

## Visual Studio 2019 の拡張機能のインストール
Visual Studio 2019のツールバーから[拡張機能]→[拡張機能の管理]を選択

検索機能から[WiX]と入力すると[WiX3 v3 - Visual Studio 2019 Wxtension]という項目がありますので、こちらをダウンロードします。
![Windows_10_x64_new.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2709147/ef8135c2-5b11-3fdb-4c5f-09db04a9970d.png)
（こちらではもう既にダウンロードしてますのでダウンロードの項目がありませんが、未ダウンロードの場合は緑のチェックマークの左にダウンロードボタンが表示されます）

## WiX Editのダウンロード
インストーラを作成するにあたり、
WiX EditというXMLの記述をサポートするソフトをダウンロードしておきます。

ダウンロード先は下記となります。

https://wixedit.github.io/

# Visual Studioにてプロジェクトの作業
## セットアッププロジェクトの作成

ソリューションから新しいプロジェクトの作成を行うと、検索欄に[WiX]の欄が追加されているので選択
![Windows_10_x64_new.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2709147/1d704441-24e4-3759-07d9-1cac25506b0a.png)

[Setup Project for WiX v3]を選択し、新しいプロジェクトを作成する
![Windows_10_x64_new.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2709147/f8bdd265-b709-4009-d859-783413afb9be.png)

インストーラ作成用のプロジェクトが作成されます
![Windows_10_x64_new.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2709147/201b8296-1845-ef55-83d6-e4a440f59f8a.png)

# WiX Editを用いてインストーラの項目を入力する

## WiXEditの実行
WiX Editを開き[File]→[Open]にて上記で作成したプロジェクトの[Product.wxs]を選択する
![Windows_10_x64_new.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2709147/7581b465-0972-0246-7661-beb6c45f352a.png)

## Product欄の入力

各種項目の設定を行う
![Windows_10_x64_new.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2709147/5c1249ca-9b87-3f28-052f-d24648086a54.png)

各項目の説明は以下となります
- Id: インストーラのGUIDを入力（アップデートを行う際はここを変更する）
- Language: 1041 (日本語)
- Manufacturer: (作者名)
- Name: (製品名)
- UpgradeCode: アップデートの識別を行うGUID（基本的に変更しない）
- Version: バージョンの記載 (メジャーVer).(マイナーVer).(任意の数字)
    
## MediaTemplate欄の入力
  右側の空欄で右クリック→[New]を選択
  ![Windows_10_x64_new.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2709147/abe80bd4-7e68-a7d6-5edd-4d5a024e305e.png)
  [EmbedCab]を選択[OK]
  ![Windows_10_x64_new.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2709147/fd835669-b274-bc37-3659-d983a018b685.png)
  yesと入力する
  ![Windows_10_x64_new.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2709147/5141ddee-8130-b23a-5d6b-7d9fcba68e64.png)
  ※インストーラに.cabファイルを含めるかの設定をしています
  
## SetDirectoryの作成

[Product]右で右クリック→[New]→[SetDirectory]を選択
![Windows_10_x64_new.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2709147/72d3f526-9070-8ff8-c027-699dac5c0285.png)

[Id]と[Value]を選択する
![Windows_10_x64_new.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2709147/7ee03b33-995f-3937-f4f5-b52a6c5f5835.png)

各種項目の設定を行う
![Windows_10_x64_new.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2709147/49b4d23d-f92e-8ea1-f9ab-3b07de2c89c2.png)
- ID: 命名規則は自由ですが後ほど使います
- Value: インストールフォルダの指定を行います

## インストールフォルダの設定
左側のタブから[Files]を選択、[Fragment]を右クリック→[Import Folder]を選択
![Windows_10_x64_new.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2709147/e7b4ed13-dd3c-470f-aca4-a619c0c48e52.png)

※ここではインストールしたいプログラムをまとめてフォルダ化しているのでフォルダの選択を行なっています

![Windows_10_x64_new.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2709147/7d4f9679-199d-347f-40bb-e1da12bf459d.png)

- ID: SetDirectoryの作成で命名した名称を入力します
- Value: 特に指定はありません

## サービスを作成するためのの設定を行う

サービスを登録したい[.exe]ファイルを右クリック→[ServiceControl]を選択
![Windows_10_x64_new.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2709147/31c7d456-8435-c511-5cff-a55331a0c974.png)

![Windows_10_x64_new.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2709147/3208f6ae-f40c-7865-afda-bc2cfd50894c.png)

右側の空欄で右クリック→[New]を選択
[Remove]・[Start]・[Stop]・[Wait]を選択し、[OK]
![Windows_10_x64_new.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2709147/ab8f4468-9516-92cd-9519-91cf5dc9a0e0.png)

各種項目の設定を行います
![Windows_10_x64_new.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2709147/c48c1759-a361-0c73-c1ab-cef143e81f3f.png)

- Id:識別子
- Name:インストールするサービス名
- Remove:サービスがインストーラの、インストール・アンインストール時に削除するか選択できます
インストーラのアンインストールをした際にサービスの削除も行いたいので[uninstall]を選択
- Start:サービスがインストーラの、インストール・アンインストール時に開始するか選択できます
インストーラのインストールをした際にサービスの開始も行いたいので[install]を選択
- Stop:サービスがインストーラの、インストール・アンインストール時に停止するか選択できます
インストーラのインストール・アンインストールをした際にサービスの停止も行いたいので[both]を選択
- Wait:サービスの登録が完了するまで待つので[yes]選択

サービスを登録したい[.exe]ファイルを右クリック→[Serviceinstall]を選択
![Windows_10_x64_new.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2709147/73d0d0a8-32fc-f0d6-0273-a91900c3d267.png)

右側の空欄で右クリック→[New]を選択
[Account]・[DisplayName]・[Id]を選択し、[OK]
![Windows_10_x64_new.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2709147/0106b3f7-7b4b-6c62-9aa8-7d06d169c389.png)

各種項目の設定を行います
![Windows_10_x64_new.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2709147/59319b58-f301-d7a0-f182-408e1ef93de2.png)
- Account:サービスを開始するアカウント
- DisplayName:サービスで表示される説明欄に表示される文字列
- ErrorControl:エラーにおいて、どのアクションを決定する項目
- Id:識別子
- Name:インストールするサービス名
- Start:サービスの開始について
- Type:サービスの登録タイプについて

## Feature設定
Featuresタブ選択、[Product Feature]を右クリック→[Select Components to add]を選択
![Windows_10_x64_new.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2709147/fe1275b4-0117-ae00-0bf1-cea4734f6192.png)

インストールしたいファイルを選択し[OK]
![Windows_10_x64_new.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2709147/c086a119-0a52-1a79-7ae3-dc835c1e6f23.png)

作業が終わりましたら[CTRL + S]で保存 


VisualStudio側で[Product.wxs]を確認すると以下のようになっております

```
<?xml version="1.0" encoding="utf-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
    <Product Id="AAAAAAAA-AAAA-AAAA-AAAA-AAAAAAAAAAAA" Name="SAMPLETOOL" Language="1041" Version="1.0.0" Manufacturer="TEMP" UpgradeCode="AAAAAAAA-AAAA-AAAA-AAAA-AAAAAAAAAAAA">
        <Package InstallerVersion="200" Compressed="yes" InstallScope="perMachine" />
        <MajorUpgrade DowngradeErrorMessage="A newer version of [ProductName] is already installed." />
        <MediaTemplate EmbedCab="yes" />
        <Feature Id="ProductFeature" Title="QTestApp" Level="1">
            <ComponentRef Id="QTESTTOOL.EXE" />
            <ComponentRef Id="QTESTTOOL.EXE.CONFIG" />
        </Feature>
        <UI />
        <SetDirectory Id="INSTALLFOLDER" Value="D:\Sample" />
    </Product>
    <Fragment>
        <Directory Id="TARGETDIR" Name="SourceDir">
            <Directory Id="INSTALLFOLDER" Name="QTestApp">
                <Component Id="QTESTTOOL.EXE" DiskId="1" Guid="B77E75E0-94B0-4FF0-BACF-B331AA97B125">
                    <File Id="QTESTTOOL.EXE" Name="QTestTool.exe" Source="..\QTestTool\bin\Debug\QTestTool.exe" />
                    <ServiceControl Id="StartService" Name="QToolService" Remove="uninstall" Start="install" Stop="both" Wait="yes" />
                    <ServiceInstall Name="QToolService" Type="ownProcess" Start="auto" ErrorControl="normal" Account="LocalSystem" Id="ServiceInstaller" DisplayName="QToolService" />
                </Component>
                <Component Id="QTESTTOOL.EXE.CONFIG" DiskId="1" Guid="D3AC4038-1F31-4E39-AF55-A4C6F3A14927">
                    <File Id="QTESTTOOL.EXE.CONFIG" Name="QTestTool.exe.config" Source="..\QTestTool\bin\Debug\QTestTool.exe.config" />
                </Component>
            </Directory>
        </Directory>
    </Fragment>
</Wix>
```

# Visual Studio 側でビルドをする
Visual Studio側で作成した、プロジェクトでビルドを行う
![Windows_10_x64_new.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2709147/3c813d00-d534-0f95-23bf-dbb54790fc53.png)

ビルドが完了すると.msiファイルが作成されます

![Windows_10_x64_new.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2709147/4709403c-69ea-33de-5742-a6d622b127ea.png)

インストールをすると指定したフォルダにファイルが配置、サービスが開始していることが確認できました！

![Windows_10_x64_new.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2709147/1210c3d7-c64f-5a6d-e80b-488af913c591.png)

![Windows_10_x64_new.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2709147/71f85c44-36ff-b79d-99b0-10e8bb3f3ef5.png)

# さいごに
Visual Studio 2019 × WiXToolSetを用いて最低限のサービスプログラムのインストーラを作成しました。
WiXToolSetは様々なインストール機能の作成が出来るみたいなので時間がある際に触ってみたいと思います。