Создание установщика службы Windows

При создании службы .NET Windows (не ошибаться со службой Windows .NET Framework) может потребоваться создать установщик для службы. Без установщика пользователям потребуется узнать, как установить и настроить службу. Установщик объединяет исполняемые файлы приложения и предоставляет настраиваемый опыт установки. Это руководство является продолжением руководства по созданию службы Windows . В нем показано, как создать установщик для службы Windows .NET.

В этом руководстве описано, как:

  • Установите расширение Visual Studio Installer Projects.
  • Создайте проект установки.
  • Обновите существующий рабочий проект .NET для поддержки установки.
  • Автоматизация установки и удаления с помощью диспетчера управления службами Windows.

Предпосылки

Установка зависимостей программных инструментов

Начните с установки набора инструментов Wix. Набор инструментов Wix — это набор средств, которые создают пакеты установки Windows из исходного кода XML.

dotnet tool install --global wix

Затем установите расширение HeatWave для VS2022. После установки перезапустите Visual Studio и увидите доступные новые шаблоны проектов.

Получите существующий проект

Это руководство основано на приложении, созданном в рамках руководства по созданию службы Windows с помощью BackgroundService. Вы можете клонировать пример репозитория или использовать приложение, созданное в предыдущем руководстве.

Подсказка

Все примеры исходного кода из "Workers in .NET" доступны в обзоре примеров для загрузки. Дополнительные сведения см. в разделе Примеры кода: рабочие процессы в .NET.

Откройте решение в Visual Studio и выберите F5 , чтобы убедиться, что приложение создает и выполняется должным образом. Чтобы остановить приложение, нажмите клавиши CTRL+C.

Добавление нового проекта установки

Чтобы добавить новый проект установки Wix, щелкните правой кнопкой мыши решение в обозревателе решений и выберите команду Добавить > новый проект:

Добавление диалогового окна создания проекта: новый пакет MSI (Wix версии 4).

Выберите пакет MSI (Wix версии 4) из доступных шаблонов, а затем нажмите кнопку "Далее". Укажите нужное имя и расположение, а затем нажмите кнопку "Создать".

Настройка проекта установщика

Чтобы настроить проект установки, сначала необходимо добавить ссылку на 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 -->
        <StandardDirectory Id="ProgramFiles6432Folder">

            <!-- 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>
        </StandardDirectory>

        <!-- 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"
                                Account="LocalService"
                                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>

ServiceInstall Атрибут элемента Account указывает учетную запись, в которой выполняется служба. Учетная LocalService запись — это встроенная учетная запись с ограниченными привилегиями, подходящими для большинства служб. К общим значениям относятся:

  • LocalService: встроенная учетная запись с ограниченными привилегиями и без сетевых учетных данных.
  • NetworkService: аналогично LocalService, но имеет сетевые учетные данные.
  • LocalSystem: высокий уровень привилегий (используйте с осторожностью).

При сборке проекта выходные данные — это MSI-файл, который можно использовать для установки и удаления службы.

Тестовая установка

Чтобы протестировать установщик, опубликуйте проект App.WindowsService . Щелкните проект правой кнопкой мыши в обозревателе решений и выберите "Опубликовать". После публикации с профилем, созданным в предыдущем руководстве, исполняемый файл будет находиться в каталоге публикации. Затем вы создадите проект установки и запустите установщик.

Необходимо запустить установку от имени администратора. Для этого щелкните файл MSI правой кнопкой мыши и выберите команду "Запуск от имени администратора".

После установки службы можно открыть службы , чтобы увидеть запущенную службу. Чтобы удалить службу, используйте функцию "Добавление или удаление программ" Windows для вызова установщика.

См. также