Windows 서비스 설치 프로그램 만들기

.NET Windows 서비스(.NET Framework Windows 서비스와 혼동하지 말 것)를 만들 때 서비스에 대한 설치 프로그램을 만들 수 있습니다. 설치 프로그램이 없으면 사용자는 서비스를 설치하고 구성하는 방법을 알아야 합니다. 설치 프로그램은 앱의 실행 파일을 번들로 묶고 사용자 지정 가능한 설치 사용자 환경을 제공합니다. 이 자습서는 Windows 서비스 만들기 자습서의 연속입니다. .NET Windows 서비스용 설치 프로그램을 만드는 방법을 보여 줍니다.

이 자습서에서는 다음 작업을 수행하는 방법을 알아봅니다.

  • Visual Studio 설치 관리자 프로젝트 확장을 설치합니다.
  • 설치 프로젝트를 만듭니다.
  • 설치를 지원하도록 기존 .NET Worker 프로젝트를 업데이트합니다.
  • Windows 서비스 제어 관리자를 사용하여 설치 및 제거를 자동화합니다.

필수 조건

도구 종속성 설치

Wix 도구 집합을 설치하여 시작합니다. Wix 도구 집합은 XML 소스 코드에서 Windows 설치 패키지를 빌드하는 도구 집합입니다.

dotnet tool install --global wix

다음으로, VS2022용 HeatWave 확장을 설치합니다. 설치 후 Visual Studio를 다시 시작하면 사용 가능한 새 프로젝트 템플릿이 표시됩니다.

기존 프로젝트 가져오기

이 자습서는 BackgroundService를 사용하여 Windows 서비스 만들기 자습서의 일부로 만들어진 앱을 기반으로 합니다. 샘플 리포지토리를 복제하거나 이전 자습서에서 빌드한 앱을 사용할 수 있습니다.

모든 ‘.NET의 작업자’ 예제 소스 코드는 샘플 브라우저에서 다운로드할 수 있습니다. 자세한 내용은 코드 샘플 찾아보기: .NET의 작업자를 참조하세요.

Visual Studio에서 솔루션을 열고 F5를 선택하여 앱이 예상대로 빌드되고 실행되는지 확인합니다. 앱을 중지하려면 Ctrl+C를 누릅니다.

새 설치 프로젝트 추가

새 Wix 설정 프로젝트를 추가하려면 솔루션 탐색기에서 솔루션을 마우스 오른쪽 단추로 클릭하고 > 새 프로젝트 추가를 선택합니다.

Add new project dialog: New MSI Package (Wix v4) Project.

사용 가능한 템플릿에서 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 프로그램 추가/제거 기능을 사용하여 설치 프로그램을 호출합니다.

참고 항목