次の方法で共有


Windows サービス インストーラーを作成する

.NET Windows サービスを作成するときに (.NET Framework Windows サービスと間違えないように)、サービスのインストーラーを作成できます。 インストーラーがない場合、ユーザーはサービスをインストールして構成する方法を知っている必要があります。 インストーラーによってアプリの実行可能ファイルがバンドルされ、カスタマイズ可能なインストール ユーザー エクスペリエンスが公開されます。 このチュートリアルは、 Windows サービスの作成 に関するチュートリアルの続きです。 .NET Windows サービスのインストーラーを作成する方法を示します。

このチュートリアルで学習する内容は次のとおりです。

  • Visual Studio インストーラー プロジェクト拡張機能をインストールします。
  • セットアップ プロジェクトを作成します。
  • インストールをサポートするように既存の .NET Worker プロジェクトを更新します。
  • Windows Service Control Manager を使用して、インストールとアンインストールを自動化します。

前提条件

  • Windows サービスの作成に関するチュートリアルを完了しているか、サンプル リポジトリを複製する準備が整っている必要があります。
  • .NET 8.0 SDK 以降
  • Windowsオペレーティングシステム
  • .NET 統合開発環境 (IDE)
  • 既存の .NET Windows サービス

ツールの依存関係をインストールする

まず、Wix ツールセットをインストールします。 Wix ツールセットは、XML ソース コードから Windows インストール パッケージをビルドする一連のツールです。

dotnet tool install --global wix

次に、 HEATWave for VS2022 拡張機能をインストールします。 インストール後、Visual Studio を再起動すると、使用可能な新しいプロジェクト テンプレートが表示されます。

既存のプロジェクトを取得する

このチュートリアルは、 BackgroundService を使用した Windows サービスの作成 チュートリアルの一部として作成されたアプリに基づいています。 サンプル リポジトリを複製するか、前のチュートリアルでビルドしたアプリを使用できます。

ヒント

すべての ".NET のワーカー" サンプル ソース コードは、 サンプル ブラウザー でダウンロードできます。 詳細については、「コードサンプルを閲覧: .NET のワーカー」を参照してください。

Visual Studio でソリューションを開き、 F5 キーを押して、アプリが想定どおりにビルドおよび実行されるようにします。 Ctrl+キーを押してアプリを停止します。

新しいセットアップ プロジェクトを追加する

新しい Wix セットアップ プロジェクトを追加するには、 ソリューション エクスプローラー でソリューションを右クリックし、[ 新しいプロジェクト > 追加] を選択します。

[新しいプロジェクトの追加] ダイアログ: 新しい MSI パッケージ (Wix v4) プロジェクト。

使用可能なテンプレートから MSI パッケージ (Wix v4) を選択し、[ 次へ] を選択します。 目的の 名前場所を指定し、[ 作成] を選択します。

インストーラー プロジェクトを構成する

セットアップ プロジェクトを構成するには、まず、 App.WindowsService プロジェクトへの参照を追加する必要があります。 ソリューション エクスプローラーでセットアップ プロジェクトを右クリックし、[プロジェクト参照>追加] を選択します。

テンプレートには、コンポーネント ファイルとローカライズ ファイルの例が含まれています。 Package.wxs ファイルのみを残すファイルを削除します。 プロジェクトには、次のような ProjectReference 要素が含まれるはずです。

<Project Sdk="WixToolset.Sdk/4.0.0">
  <ItemGroup>
    <ProjectReference Include="..\App.WindowsService.csproj" />
  </ItemGroup>
</Project>

プロジェクト参照が追加されたら、 Package.wxs ファイルを 構成します。 エディターでファイルを開き、内容を次のように置き換えます。

<?xml version="1.0" encoding="UTF-8"?>

<!-- Define the variables in "$(var.*) expressions" -->
<?define Name = ".NET Joke Service" ?>
<?define Manufacturer = "Microsoft" ?>
<?define Version = "1.0.0.0" ?>
<?define UpgradeCode = "9ED3FF33-8718-444E-B44B-69A2344B7E98" ?>

<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs">
    <Package Name="$(Name)"
             Manufacturer="$(Manufacturer)"
             Version="$(Version)"
             UpgradeCode="$(var.UpgradeCode)"
             Compressed="true">

        <!-- Allow upgrades and prevent downgrades -->
        <MajorUpgrade DowngradeErrorMessage="A later version of [ProductName] is already installed. Setup will now exit." />

        <!-- Define the directory structure -->
        <Directory Id="TARGETDIR" Name="SourceDir">
            <Directory Id="ProgramFiles64Folder">

                <!-- Create a folder inside program files -->
                <Directory Id="ROOTDIRECTORY" Name="$(var.Manufacturer)">

                    <!-- Create a folder within the parent folder given the name -->
                    <Directory Id="INSTALLFOLDER" Name="$(Name)" />
                </Directory>
            </Directory>
        </Directory>

        <!-- The files inside this DirectoryRef are linked to
             the App.WindowsService directory via INSTALLFOLDER -->
        <DirectoryRef Id="INSTALLFOLDER">

            <!-- Create a single component which is the App.WindowsService.exe file -->
            <Component Id="ServiceExecutable" Bitness="always64">

                <!-- Copies the App.WindowsService.exe file using the
                     project reference preprocessor variables -->
                <File Id="App.WindowsService.exe"
                      Source="$(var.App.WindowsService.TargetDir)publish\App.WindowsService.exe"
                      KeyPath="true" />

                <!-- Remove all files from the INSTALLFOLDER on uninstall -->
                <RemoveFile Id="ALLFILES" Name="*.*" On="both" />

                <!-- Tell WiX to install the Service -->
                <ServiceInstall Id="ServiceInstaller"
                                Type="ownProcess"
                                Name="App.WindowsService"
                                DisplayName="$(Name)"
                                Description="A joke service that periodically logs nerdy humor."
                                Start="auto"
                                ErrorControl="normal" />

                <!-- Tell WiX to start the Service -->
                <ServiceControl Id="StartService"
                                Start="install"
                                Stop="both"
                                Remove="uninstall"
                                Name="App.WindowsService"
                                Wait="true" />
            </Component>
        </DirectoryRef>

        <!-- Tell WiX to install the files -->
        <Feature Id="Service" Title="App.WindowsService Setup" Level="1">
            <ComponentRef Id="ServiceExecutable" />
        </Feature>

    </Package>
</Wix>

プロジェクトをビルドすると、サービスのインストールとアンインストールに使用できる MSI ファイルが出力されます。

インストールのテスト

インストーラーをテストするには、 App.WindowsService プロジェクトを発行します。 ソリューション エクスプローラーでプロジェクトを右クリックし、[発行] を選択します。 前のチュートリアルで作成したプロファイルを使用して発行すると、実行可能ファイルは発行ディレクトリに格納されます。 次に、セットアップ プロジェクトを ビルド し、インストーラーを実行します。

インストールを管理者として実行する必要があります。 これを行うには、MSI ファイルを右クリックし、[ 管理者として実行] を選択します。

サービスがインストールされたら、 サービス を開いて、実行中のサービスを確認できます。 サービスをアンインストールするには、Windows の [プログラムの追加と削除] 機能を使用してインストーラーを呼び出します。

こちらもご覧ください