WiX Toolsetで.NET 5をインストールさせる

“.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”と呼ぶことにします.


手順

  1. “Bootstrapper Project for WiX v3″なるプロジェクトテンプレートでソリューションにプロジェクトを追加
  2. ターゲットプラットフォーム用(x86/x64)の”.NET ランタイム インストーラー”をダウンロードしてプロジェクトに追加
  3. 既存のアプリ用インストーラー(ここでは”hogehogeSetupProject.msi”)のビルド
  4. テンプレートが用意してくれた”Bundle.wxs”に必要事項を追記
  5. ビルド

それでは順を追っていきます.

1. “Bootstrapper Project for WiX v3″でプロジェクトを追加

ソリューションエクスプローラーで操作

ソリューションを右クリックして「新しいプロジェクト」を追加
「wix bootstrapper」で検索(結果をスクロールしないと見えない位置にある)

既存のインストーラーと被らない名前でプロジェクトを作成
プロジェクトが追加され”Bundle.wxs”がエディターで表示された

2. .NETランタイムのインストーラーのダウンロード

“.NET 5″のランタイムのインストーラーをダウンロードします.これから作成するインストーラーに含めるためです.x86とx64用の両方を,以下のサイトからダウンロードしておいてください.他の.NETのバージョン(.NET Core系に限る)も同様に手に入れることが出来ます.

なお,”.NET デスクトップランタイム”と”.NET ランタイム”の2種類がありますが,ウィンドウを持つアプリを作成している場合は「デスクトップランタイム」をダウンロードします.デスクトップランタイムは,”.NET ランタイム”を含んでいます.

マイクロソフト .NET 5.0 ダウンロードサイト

ダウンロードしたファイルは,今回作成した”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”にあります.

“WixUtilExtension.dll”の参照を追加

5. ビルド

”hogehogeSetup”をビルドしてください.

“bin/Release”または”bin/Debug”にMSIファイルが出来れいれば成功です.

お疲れさまでした.