WPF(.NET Core 3.0)をWixでMSIにする方法の一例

#はじめに
今まではWPF(.NET framework)を[Microsoft Visual Studio Installer Projects]を用いてMSIにしていました。
WPF(.NET Core 3.0)でも同様に[Microsoft Visual Studio Installer Projects]を用いたのですが上手くパッケージングできなかったため、[Windows Installer XML (WiX)](https://wix-tutorial-ja.github.io)を使用してMSIを作成してみました。

今回の記事はWPF(.NET Core 3.0)を配布するための手法の一例としてご紹介です。

#WPF(.NET Core 3.0)を[Microsoft Visual Studio Installer Projects]でビルドしたら
exeではなくdllがパッケージングされてしまいました。
今回でいうと

+ WpfCore3.dll
+ WpfCore3.exe

の二つが生成されるのですが実行ファイルであるexeではなくdllの方がmsiに入ってました。

#試したソース
[WpfCore3Wix](https://github.com/kwhrkzk/WpfCore3Wix)

#WiXとは
[WiX Toolset Qiita記事のまとめ](https://qiita.com/nobb_hero/items/de53bc9bc8171519d98a)
に情報が載っています。
Windows Installer XML (WiX)の通りXMLでWindows Installerを記述できます。

#ビルド環境構築

## [Visual Studio 20XX](https://docs.microsoft.com/ja-jp/visualstudio/install/install-visual-studio?view=vs-2019)
VSCodeでも出来ると思いますが今回はVisual Studio 2019で作成しました。
candle.exeとLight.exeを実行すれば出来るのですがコマンドオプションの指定がめちゃめちゃ大変そうです。


## [Wix及びWix Toolset](https://wixtoolset.org)
Wix本体と便利にしてくれるツールセットをインストールする必要があります。
WiX Toolset Visual Studio Extensionも一緒にインストールします。

# WPF(.NET Core 3.0)プロジェクト用意
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109302/7d76cb3e-66cc-5178-72eb-803a7cb57492.png)

Visual Studioを最新にしていればWPF(.NET Core 3.0)のプロジェクト存在するはず。
後はサクッとHellow Worldを表示するウィンドウを用意します。
ソースは[ここ](https://github.com/kwhrkzk/WpfCore3Wix/tree/master/WpfCore3)

ポイントとして発行方式を単一ファイルの実行可能ファイルにしています。
[.NET Core3.0でPublishSingleFile](https://qiita.com/ten_takano/items/2ddacdf30beaedcf1531)
[.NET Core 3.0 の新機能](https://docs.microsoft.com/ja-jp/dotnet/core/whats-new/dotnet-core-3-0)

#Wixプロジェクト用意
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109302/144f26ce-8127-c58f-1876-30142a46c3d7.png)

WiX Toolset Visual Studio Extensionをインストールしていれば候補にでてくるはず。
プロジェクトファイルとxmlを記述するwxsファイルが出来上がるので編集していきます。
ソースは[ここ](https://github.com/kwhrkzk/WpfCore3Wix/tree/master/SetupWpfCore3)

## xmlを記述するwxsファイル
最初は
[Demo wix project to publish a self-contained .NET Core app](https://gist.github.com/dasMulli/33beffa15deb1caef373f5b8499082a2)
を参考にしてみたのですが上手くいかず。

試行錯誤しながら書いたのでポイントとなった点を列挙していきます。

### cabファイルとmsiファイルが出来るんだけど？
単純にビルドするとcabファイルとmsiファイルの二つが出来上がってしまいました。
これらのファイルを一体化するために記述が必要でした。
[WiXで作成したインストーラーを1つのファイルにまとめる](https://www.ipentec.com/document/visual-studio-2017-create-embed-cab-wix-installer)

### 自分でGUID考えるのめんどうくさい
[Microsoft Visual Studio Installer Projects]だとバージョンを変更したりするとGUIDを変更しますか？と聞かれて勝手に変更してくれるんですけどWixだと自分で記述しないといけません。
GUIDを生成するためのツールがVisual Studioにありました。
[GUIDを作成する - UUIDの作成](https://www.ipentec.com/document/software-create-guid)

### WixUI ダイアログ セットはどうやって使用するの？
WiX Toolsetにはよくあるインストールウィザードの一式が用意されています。こったインストーラーが不要な人ならこれで十分なのですが、単純に記述するだけじゃダメでした。

[WixUI ダイアログ セットの使用](http://cml.s10.xrea.com/ej/WiX/WixUI_dialog_library_old.htm)
[WiX Toolsetで使えるUI画面](https://qiita.com/tohshima/items/19f3b220ebc36801edbe)

ざっくり書くと**WixUIExtension.dll**の参照が必要でWixのインストールした場所にあります。
標準インストールだと
"C:\Program Files (x86)\WiX Toolset v3.11\bin\WixUIExtension.dll"

にありました。これをVisual Studioで参照するなり、コマンドオプションとして指定する必要があります。

### デフォルトのライセンスの文言を変えたい
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109302/0d84fc3a-440f-5b79-e0c7-b8f94a3e9735.png)

WixUI ダイアログ セットにはライセンスに同意する画面があるのですがそのデフォルトの
文言は変えたいです。
rtf(リッチテキストフォーマット)ファイルをwordかなんかで作成し、特定のIdでそのファイルを指定することで上書きされます。
記述例は

```xml
<WixVariable Id="WixUILicenseRtf" Value="license.rtf" />
```

[ビルトイン WixUI Dialog Set のカスタマイズ](http://cml.s10.xrea.com/ej/WiX/WixUI_customizations.htm)


### セットアッププロジェクトのビルドの前にWPF(.NET Core 3.0)プロジェクトもビルドしたいんだけど
[Microsoft Visual Studio Installer Projects]では出来てたことなのですが
残念ながら解決できませんでした。Wixのプロジェクトファイルに

```xml
<Target Name="BeforeBuild">
```

というタグがあるのでなんとかなりそうな気がするのですが。。
今回はWPF(.NET Core 3.0)プロジェクトを発行してからセットアッププロジェクトをビルドする運用で妥協しました。

```xml
        <File
          Id="WpfCore3Exe"
          Name="WpfCore3.exe"
          DiskId="1"
          KeyPath="yes"
          Source="..\WpfCore3\bin\Release\netcoreapp3.0\win10-x86\publish\WpfCore3.exe"
          >
```

発行方式を単一ファイルの実行可能ファイルにしているので一つのファイルを指定するだけで済んでます。

# まとめ
WPF(.NET Core 3.0)をWixを用いてmsiにする方法の一例について記述しました。
一番良いのは[Microsoft Visual Studio Installer Projects]が.NET Core 3.0対応してくれることなんですが。
ひとまずWPFを.NET Core 3.0に乗り換えたとしてもインストールウィザードを用いて配布出来る目途がたったので安心です。


[Microsoft Visual Studio Installer Projects]:https://marketplace.visualstudio.com/items?itemName=visualstudioclient.MicrosoftVisualStudio2017InstallerProjects