“.NET 5″を使って開発されたアプリ・サービスのインストーラー作成に”Visual Studio Installer Project”を使おうとして断念したひるやもりです.
悪戦苦闘の末に目的を達成できたので,公開します.
なにがしたかったか
”.NET 5”で開発したアプリとサービスを配布するインストーラーがある.しかし”.NET 5″のランタイムが導入されていないPCではサービスの起動に失敗し,インストールに失敗したりサービスが起動しない状態で放置され,結果としてアプリが機能しない.
インストーラーが実行に必要な”.NET 5″の有無を調べ,なければインストーラーを起動して導入したい.
はじめに
てっきり,既存のインストーラー用のXMLに追記をして実現するものだと思っていました.しかし「別途新しいプロジェクトを作るのではないか?」と思い立ったところ,正解だったようです.
奮戦記は省略します.端的に「こうしたらできた」を記します.もっと良い方法がきっとあるんだと思いますが,ご容赦ください.
前提条件は次の通り:
- Windows環境+Visual Studio 2019(他では確認していないため)
- “.NET 5″などの”.NET Core”系を使用したアプリであること
- 既に”WiX Toolset”等でインストーラー(msi形式)が出来ていること
- “WiX Toolset 3.11″がインストールされていること
- VS2019に”WiX Toolset拡張機能”がインストールされていること
※ “.NET Framework”を使用している場合は”Visual Studio Installer Project”を使えばチェックボックスにチェックをつけるだけで良いのでそちらが便利でしょう.
以降,既存のインストーラーを”hogehoge.msi”と呼ぶことにします.
手順
- “Bootstrapper Project for WiX v3″なるプロジェクトテンプレートでソリューションにプロジェクトを追加
- ターゲットプラットフォーム用(x86/x64)の”.NET ランタイム インストーラー”をダウンロードしてプロジェクトに追加
- 既存のアプリ用インストーラー(ここでは”hogehogeSetupProject.msi”)のビルド
- テンプレートが用意してくれた”Bundle.wxs”に必要事項を追記
- ビルド
それでは順を追っていきます.
1. “Bootstrapper Project for WiX v3″でプロジェクトを追加
2. .NETランタイムのインストーラーのダウンロード
“.NET 5″のランタイムのインストーラーをダウンロードします.これから作成するインストーラーに含めるためです.x86とx64用の両方を,以下のサイトからダウンロードしておいてください.他の.NETのバージョン(.NET Core系に限る)も同様に手に入れることが出来ます.
なお,”.NET デスクトップランタイム”と”.NET ランタイム”の2種類がありますが,ウィンドウを持つアプリを作成している場合は「デスクトップランタイム」をダウンロードします.デスクトップランタイムは,”.NET ランタイム”を含んでいます.
ダウンロードしたファイルは,今回作成した”hogehogeSetup”プロジェクトのフォルダーに”Resources”フォルダーを作成して,その中に入れておきます.(別の場所でも良いですが説明はこのフォルダー前提で続けます)
3. 既存のアプリ用インストーラーのビルド
.NETのランタイムと同じく,これから作成するインストーラーに含めるため,既存のアプリ用インストーラーをビルドしておきます.ここでは”hogehogeSetupProject.msi”というファイルを想定します.
これから作成するインストーラーのプロジェクトからの相対パスは,”..\hogehogeSetupProject\bin\Release\”となります.
4. テンプレートが用意してくれた”Bundle.wxs”に必要事項を追記
作成されたひな形には,こんな風に書かれています.<Chain>タグが今回のミソのようです.”UpgradeCode=”の部分はGUIDで,コピペで再利用されると困るため伏せていますが,作成されたひな形に係れているものをそのままお使いいただけます.
<?xml version="1.0" encoding="UTF-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
<Bundle Name="hogehogeSetup" Version="1.0.0.0" Manufacturer="" UpgradeCode="********-42ad-4e62-bbf1-cab6f9c7a4eb"> ← GUIDなので再利用防止のため一部伏せています
<BootstrapperApplicationRef Id="WixStandardBootstrapperApplication.RtfLicense" />
<Chain>
<!-- TODO: Define the list of chained packages. -->
<!-- <MsiPackage SourceFile="path\to\your.msi" /> -->
</Chain>
</Bundle>
</Wix>
こんな風に書き換えます.Windowsが32ビットか64ビットかをチェックして正しい方のランタイムをインストールするようにしています.
<?xml version="1.0" encoding="UTF-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi"
xmlns:util="http://schemas.microsoft.com/wix/UtilExtension">
<Bundle Name="hogehogeSetup"
Version="1.0.0.0"
Manufacturer="hogehoge corp." ← 書かないとエラーになります
UpgradeCode="********-42ad-4e62-bbf1-cab6f9c7a4eb"> ← GUIDなので再利用防止のため一部伏せています
<BootstrapperApplicationRef Id="WixStandardBootstrapperApplication.RtfLicense" />
<Chain>
<!-- TODO: Define the list of chained packages. -->
<!-- <MsiPackage SourceFile="path\to\your.msi" /> -->
<PackageGroupRef Id="dotnet5x64"/>
<PackageGroupRef Id="dotnet5x86"/>
<MsiPackage
Compressed="yes"
SourceFile="..\hogehogeSetupProject\bin\Release\hogehogeSetupProject.msi"
Vital="yes"/>
</Chain>
</Bundle>
<Fragment>
<!-- .NET Desktop Runtime 5 for 64bit OS -->
<util:DirectorySearch
Id="NetDesktopRuntime5x64Installed"
Variable="NetDesktopRuntime5x64Installed"
Path="[ProgramFiles64Folder]dotnet\shared\Microsoft.WindowsDesktop.App\5.0.11"
Result="exists" />
<PackageGroup Id="dotnet5x64">
<ExePackage
Id="dotnet5x64"
InstallCondition="NOT NetDesktopRuntime5x64Installed AND VersionNT64"
DetectCondition="NetDesktopRuntime5Installed"
Cache="no"
Compressed="yes"
PerMachine="yes"
Permanent="yes"
Vital="yes"
SourceFile="Resources\windowsdesktop-runtime-5.0.11-win-x64.exe" />
</PackageGroup>
<!-- .NET Desktop Runtime 5 for 32bit OS -->
<util:DirectorySearch
Id="NetDesktopRuntime5x86Installed"
Variable="NetDesktopRuntime5x86Installed"
Path="[ProgramFiles86Folder]dotnet\shared\Microsoft.WindowsDesktop.App\5.0.11"
Result="exists" />
<PackageGroup Id="dotnet5x86">
<ExePackage
Id="dotnet5x86"
InstallCondition="NOT NetDesktopRuntime5x86Installed AND NOT VersionNT64"
DetectCondition="NetDesktopRuntime5x86Installed"
Cache="no"
Compressed="yes"
PerMachine="yes"
Permanent="yes"
Vital="yes"
SourceFile="Resources\windowsdesktop-runtime-5.0.11-win-x86.exe" />
</PackageGroup> </Fragment>
</Wix>
冒頭に”Wix xmlns:util=・・・”という記述で,WiXに付属するユーティリティを利用しています.ソリューションエクスプローラから,”WixUtilExtension.dll”への参照を追加してください.”C:\Program Files (x86)\WiX Toolset v3.11\bin”にあります.
5. ビルド
”hogehogeSetup”をビルドしてください.
“bin/Release”または”bin/Debug”にMSIファイルが出来れいれば成功です.
お疲れさまでした.