#はじめに
今まではWPF(.NET framework)をMicrosoft Visual Studio Installer Projectsを用いてMSIにしていました。
WPF(.NET Core 3.0)でも同様にMicrosoft Visual Studio Installer Projectsを用いたのですが上手くパッケージングできなかったため、Windows Installer XML (WiX)を使用して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
#WiXとは
WiX Toolset Qiita記事のまとめ
に情報が載っています。
Windows Installer XML (WiX)の通りXMLでWindows Installerを記述できます。
#ビルド環境構築
Visual Studio 20XX
VSCodeでも出来ると思いますが今回はVisual Studio 2019で作成しました。
candle.exeとLight.exeを実行すれば出来るのですがコマンドオプションの指定がめちゃめちゃ大変そうです。
Wix及びWix Toolset
Wix本体と便利にしてくれるツールセットをインストールする必要があります。
WiX Toolset Visual Studio Extensionも一緒にインストールします。
WPF(.NET Core 3.0)プロジェクト用意
Visual Studioを最新にしていればWPF(.NET Core 3.0)のプロジェクト存在するはず。
後はサクッとHellow Worldを表示するウィンドウを用意します。
ソースはここ
ポイントとして発行方式を単一ファイルの実行可能ファイルにしています。
.NET Core3.0でPublishSingleFile
.NET Core 3.0 の新機能
WiX Toolset Visual Studio Extensionをインストールしていれば候補にでてくるはず。
プロジェクトファイルとxmlを記述するwxsファイルが出来上がるので編集していきます。
ソースはここ
xmlを記述するwxsファイル
最初は
Demo wix project to publish a self-contained .NET Core app
を参考にしてみたのですが上手くいかず。
試行錯誤しながら書いたのでポイントとなった点を列挙していきます。
cabファイルとmsiファイルが出来るんだけど?
単純にビルドするとcabファイルとmsiファイルの二つが出来上がってしまいました。
これらのファイルを一体化するために記述が必要でした。
WiXで作成したインストーラーを1つのファイルにまとめる
自分でGUID考えるのめんどうくさい
Microsoft Visual Studio Installer Projectsだとバージョンを変更したりするとGUIDを変更しますか?と聞かれて勝手に変更してくれるんですけどWixだと自分で記述しないといけません。
GUIDを生成するためのツールがVisual Studioにありました。
GUIDを作成する - UUIDの作成
WixUI ダイアログ セットはどうやって使用するの?
WiX Toolsetにはよくあるインストールウィザードの一式が用意されています。こったインストーラーが不要な人ならこれで十分なのですが、単純に記述するだけじゃダメでした。
WixUI ダイアログ セットの使用
WiX Toolsetで使えるUI画面
ざっくり書くとWixUIExtension.dllの参照が必要でWixのインストールした場所にあります。
標準インストールだと
"C:\Program Files (x86)\WiX Toolset v3.11\bin\WixUIExtension.dll"
にありました。これをVisual Studioで参照するなり、コマンドオプションとして指定する必要があります。
デフォルトのライセンスの文言を変えたい
WixUI ダイアログ セットにはライセンスに同意する画面があるのですがそのデフォルトの
文言は変えたいです。
rtf(リッチテキストフォーマット)ファイルをwordかなんかで作成し、特定のIdでそのファイルを指定することで上書きされます。
記述例は
<WixVariable Id="WixUILicenseRtf" Value="license.rtf" />
ビルトイン WixUI Dialog Set のカスタマイズ
セットアッププロジェクトのビルドの前にWPF(.NET Core 3.0)プロジェクトもビルドしたいんだけど
Microsoft Visual Studio Installer Projectsでは出来てたことなのですが
残念ながら解決できませんでした。Wixのプロジェクトファイルに
<Target Name="BeforeBuild">
というタグがあるのでなんとかなりそうな気がするのですが。。
今回はWPF(.NET Core 3.0)プロジェクトを発行してからセットアッププロジェクトをビルドする運用で妥協しました。
<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に乗り換えたとしてもインストールウィザードを用いて配布出来る目途がたったので安心です。