Comparteix a través de


Creación de un instalador de servicio de Windows

Al crear un servicio de Windows de .NET (no confundir con un servicio de Windows de .NET Framework), es posible que quiera crear también un instalador para el servicio. Sin un instalador, los usuarios tendrían que saber cómo instalar y configurar el servicio. Un instalador agrupa los ejecutables de la aplicación y ofrece una experiencia de usuario de instalación personalizable. Este tutorial es una continuación del tutorial Creación de un servicio de Windows. Muestra cómo crear un instalador para el servicio Windows de .NET.

En este tutorial, aprenderá a:

  • Instalar la extensión Visual Studio Installer Projects.
  • Crear un proyecto de instalación.
  • Actualizar un proyecto de trabajo de .NET existente para admitir la instalación.
  • Automatizar la instalación y desinstalación con el Administrador de control de servicios de Windows.

Requisitos previos

Instalación de dependencias de herramientas

Empiece por instalar el conjunto de herramientas de Wix. El conjunto de herramientas de Wix es un conjunto de herramientas que crean paquetes de instalación de Windows a partir del código fuente XML.

dotnet tool install --global wix

A continuación, instale la extensión de HeatWave para VS2022. Después de instalarla, reinicie Visual Studio y verá que hay nuevas plantillas de proyecto disponibles.

Obtención del proyecto existente

Este tutorial se basa en la aplicación creada como parte del tutorial Creación de un servicio de Windows mediante BackgroundService. Puede clonar el repositorio de ejemplo o usar la aplicación que creó en el tutorial anterior.

Sugerencia

Todo el ejemplo de "Trabajos en .NET" está disponible en el Explorador de ejemplos para su descarga. Para obtener más información, consulte Examinación de ejemplos de código: Trabajos en .NET.

Abra la solución en Visual Studio y seleccione F5 para asegurarse de que la aplicación se compila y se ejecuta según lo previsto. Presione CTRL+C para detener la aplicación.

Adición de un nuevo proyecto de instalación

Para agregar un nuevo proyecto de instalación de Wix, haga clic con el botón derecho en la solución en el Explorador de soluciones y seleccione Agregar > Nuevo proyecto:

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

Seleccione Paquete MSI (Wix v4) en las plantillas disponibles y, a continuación, seleccione Siguiente. Proporcione el nombre y la ubicación deseados y, después, seleccione Crear.

Configuración del proyecto de instalador

Para configurar el proyecto de instalación, primero debe agregar una referencia al proyecto App.WindowsService. Haga clic con el botón derecho en el proyecto de instalación en el Explorador de soluciones y seleccione Agregar > Referencia de proyecto.

La plantilla incluye archivos de componente y localización de ejemplo. Elimine estos archivos y deje solo el archivo Package.wxs. El proyecto ahora debe incluir un elemento ProjectReference similar al siguiente:

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

Una vez agregada la referencia del proyecto, configure el archivo Package.wxs. Abra el archivo en el editor y reemplace el contenido por lo siguiente:

<?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>

Al compilar el proyecto, la salida es un archivo MSI que se puede usar para instalar y desinstalar el servicio.

Prueba de la instalación

Para probar el instalador, publique el proyecto App.WindowsService. Haga clic con el botón derecho en el proyecto en el Explorador de soluciones y seleccione Publicar. Una vez publicado con el perfil que creó en el tutorial anterior, el ejecutable estará en el directorio publish. A continuación, compile el proyecto de instalación y ejecute el instalador.

Debe ejecutar la instalación como administrador. Para ello, haga clic con el botón derecho en el archivo .msi y, a continuación, seleccione Ejecutar como administrador.

Una vez instalado el servicio, puede abrir Servicios para ver el servicio en ejecución. Para desinstalar el servicio, use la característica Agregar o quitar programas de Windows para llamar al instalador.

Vea también