Creare un programma di installazione del servizio Windows

Quando si crea un servizio Windows .NET (da non confondere con un servizio Windows .NET Framework), è possibile creare un programma di installazione per il servizio. Senza un programma di installazione, gli utenti dovranno sapere come installare e configurare il servizio. Un programma di installazione aggrega i file eseguibili dell'app ed espone un'esperienza utente di installazione personalizzabile. Questa esercitazione è una continuazione dell'esercitazione Creare un servizio Windows. Illustra come creare un programma di installazione per il servizio Windows .NET.

Questa esercitazione illustra come:

  • Installa l’estensione di Visual Studio per progetti di programmi di installazione.
  • Crea un progetto di installazione.
  • Aggiorna un progetto di lavoro .NET esistente per supportare l'installazione.
  • Automatizza l'installazione e la disinstallazione con la Gestione controllo servizi di Windows.

Prerequisiti

Installa le dipendenze degli strumenti

Per iniziare, installa il set di strumenti Wix. Il set di strumenti Wix è un set di strumenti che compila pacchetti di installazione di Windows dal codice sorgente XML.

dotnet tool install --global wix

Installa quindi l'estensione HeatWave per VS2022. Dopo l'installazione, riavvia Visual Studio e verranno visualizzati nuovi modelli di progetto disponibili.

Ottieni un progetto esistente

Questa esercitazione si basa sull'app creata come parte dell'esercitazione Creare un servizio Windows con BackgroundService. È possibile clonare il repository di esempio o usare l'app compilata nell'esercitazione precedente.

Suggerimento

Tutto il codice sorgente di esempio di "Ruoli di lavoro in .NET" è disponibile per il download nel browser esempi. Per altre informazioni, fai riferimento a Esplorare esempi di codice: ruoli di lavoro in .NET.

Apri la soluzione in Visual Studio e seleziona F5 per assicurarti che l'app venga compilata ed eseguita come previsto. Premi Ctrl+C per arrestare l'app.

Aggiungere un nuovo progetto di installazione

Per aggiungere un nuovo progetto di installazione Wix, fai clic con il pulsante destro del mouse in Esplora soluzioni e scegli Aggiungi > Nuovo progetto:

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

Seleziona Pacchetto MSI (Wix v4) nei modelli disponibili e quindi seleziona Avanti. Specifica il Nome e il Percorsodesiderati, quindi seleziona Crea.

Configurare il progetto del programma di installazione

Per configurare il progetto di installazione, è prima necessario aggiungere un riferimento al progetto App.WindowsService. Fai clic con il pulsante destro del mouse sul progetto di configurazione in Esplora soluzioni e quindi scegli Aggiungi > riferimento al progetto.

Il modello include file di componenti di esempio e di localizzazione. Elimina questi file, lasciando solo il file Package.wxs. Il progetto dovrebbe ora includere un elemento ProjectReference, simile al seguente:

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

Dopo aver aggiunto il riferimento al progetto, configura il file Package.wxs. Apri il file nell'editor e quindi sostituisci il contenuto con quanto segue:

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

Quando si compila il progetto, l'output è un file MSI che può essere usato per installare e disinstallare il servizio.

Testare l'installazione

Per testare il programma di installazione, pubblica il progetto App.WindowsService. Fai clic con il pulsante destro del mouse sul progetto in Esplora soluzioni e scegli Pubblica. Dopo la pubblicazione con il profilo creato nell'esercitazione precedente, l'eseguibile si troverà nella directory di pubblicazione. Successivamente, compila il progetto di installazione ed esegui il programma di installazione.

È necessario eseguire l'installazione come amministratore. A tale scopo, fai clic con il pulsante destro del mouse sul file MSI e scegli Esegui come amministratore.

Dopo aver installato il servizio, è possibile aprire Servizi per visualizzare il servizio in esecuzione. Per disinstallare il servizio, usare la funzionalità Installazione applicazioni di Windows per chiamare il programma di installazione.

Vedi anche