Opret en tjeneste til Windows i .NET 8

Side opdateret :
Dato for oprettelse af side :

Driftsmiljø

Visual Studio
  • Visual Studio 2022
.NET
  • .NET 8
Windows
  • Windows 11

Forudsætninger

Visual Studio
  • Visual Studio 2022
.NET
  • .NET 8
Windows
  • Windows 10
  • Windows 11
Windows Server
  • Windows 2012 eller nyere

forudsætning

  • Visual Studio er allerede installeret

Først

Når jeg forsøger at oprette en Windows-tjeneste i Visual Studio .NET, er der kun .NET Framework-skabeloner. Den kan også oprettes i .NET (Core), og skabelonen hedder "Worker Service".

I denne artikel vil jeg forklare, hvordan du bruger dette til at oprette, registrere og køre en Windows-tjeneste. Behandlingsindholdet er minimalt, så hvis du kan bekræfte, at det kører som en Windows-tjeneste, skal du oprette funktionen.

Opret et projekt

Start Visual Studio. Vælg Opret et nyt projekt.

Angiv i サービス søgefeltet ovenfor, og vælg derefter Arbejderservice på listen. "Windows Services" er .NET Framework-versionen, som ikke har en .NET-version.

Projektets navn og placering kan være vilkårlig. Det påvirker ikke den tjeneste, du tilmelder dig.

「. NET 8.0 er valgt, og lad standardindstillingerne være for at oprette den.

Projektet er blevet oprettet.

Tilføjelse af biblioteker

I den oprindelige tilstand har den kun en "service"-funktion og ingen Windows-specifikke funktioner. Tilføj et bibliotek, der kan bruges af en Windows-tjeneste fra NuGet.

Højreklik på Afhængigheder, og vælg Administrer NuGet-pakker.

Vælg fanen Gennemse, og indtast i Microsoft.Extensions.Hosting.WindowsServices søgefeltet. Det vises på listen, så installer det.

Klik på Anvend.

Det blev tilføjet som en pakke.

Redigering af programmer

Denne gang vil jeg oprette en tjeneste, der med jævne mellemrum tilføjer tekst til en tekstfil som en Mr./Ms..

Program.cs

Tilføj funktionaliteten af Windows-tjenesten som følger:

var builder = Host.CreateApplicationBuilder(args);
// ↓ここから追加
builder.Services.AddWindowsService();
// ↑ここまで追加
builder.Services.AddHostedService<Worker>();

var host = builder.Build();
host.Run();

Worker.cs

Du kan ændre klassenavnet vilkårligt, men for denne gang vil vi lade standarden stå.

Som standard er der kun metoder, der behandles ExecuteAsync , når tjenesten udføres, men lad os ændre det som følger:

public class Worker : BackgroundService
{
  private readonly ILogger<Worker> _logger;

  /// <summary>ログの出力先フォルダパス。</summary>
  private const string OutputLogFolderPath = @"C:\Temporary\";

  /// <summary>ログの出力先ファイルパス。</summary>
  private const string OutputLogFilePath = @$"{OutputLogFolderPath}Test.log";


  public Worker(ILogger<Worker> logger)
  {
    _logger = logger;
  }

  /// <summary>
  /// サービスが開始されたときに呼ばれます。
  /// </summary>
  /// <param name="stoppingToken"></param>
  /// <returns></returns>
  public override async Task StartAsync(CancellationToken stoppingToken)
  {
    if (Directory.Exists(OutputLogFolderPath) == false)
    {
      Directory.CreateDirectory(OutputLogFolderPath);
    }
    File.AppendAllText(OutputLogFilePath, $"StartAsync サービスを開始しました。\r\n");

    await base.StartAsync(stoppingToken);
  }

  /// <summary>
  /// サービスが終了したときに呼ばれます。
  /// </summary>
  /// <param name="stoppingToken"></param>
  /// <returns></returns>
  public override async Task StopAsync(CancellationToken stoppingToken)
  {
    File.AppendAllText(OutputLogFilePath, $"StopAsync サービスを終了しました。\r\n");
    File.AppendAllText(OutputLogFilePath, $"------------------------------\r\n");

    await base.StopAsync(stoppingToken);
  }

  /// <summary>
  /// サービスが実行されたときに呼ばれます。
  /// </summary>
  /// <param name="stoppingToken">サービスの非同期キャンセルトークン。</param>
  /// <returns></returns>
  protected override async Task ExecuteAsync(CancellationToken stoppingToken)
  {
    while (!stoppingToken.IsCancellationRequested)
    {
      File.AppendAllText(OutputLogFilePath, $"{DateTime.Now}\r\n");

      if (_logger.IsEnabled(LogLevel.Information))
      {
        _logger.LogInformation("Worker running at: {time}", DateTimeOffset.Now);
      }
      await Task.Delay(1000 * 60, stoppingToken);
    }
  }
}

Vi har tilføjet en ny metode og StopAsync en ny StartAsync metode. Som navnet antyder, kaldes disse metoder, når tjenesten startes, og når den stoppes. Indholdet af processen er simpelthen at oprette mapper og skrive tekst, så jeg vil udelade forklaringen.

ExecuteAsync Metoden fortsætter med at loope med stoppingToken, indtil while den er markeret til annullering. Tilføj det, while du vil behandle, mens tjenesten kører. Men hvis du kun skriver den proces, du vil flytte, vil tjenesten køre med fuld kapacitet, så Task.Delay det er grundlæggende at flytte den, mens du venter på et bestemt tidspunkt med metoden. Som standard er den indstillet til 1 sekund (1000ms), så omskriv den til enhver tid.

Debug

Du kan foretage fejlfinding fra Visual Studio. Du kan være sikker på, at du faktisk ikke vil blive registreret hos tjenesten.

Når du kører den, vises konsollen.

Hvis processen er korrekt, kan du se, at filen er oprettet.

Hvis du vil stoppe fejlfindingen, skal du lukke konsollen.

Hvis du kontrollerer loggen, kan du se, at tjenestens startproces er overstået, men det er opsigelsesprocessen ikke. For at se opsigelsen skal du faktisk registrere dig hos Windows-tjenesten for at bekræfte den.

spørgsmål

For at kunne registrere dig hos en Windows-tjeneste skal du udgive programmet. Højreklik på projektet, og vælg Udgiv.

Vælg Mapper.

Mappeplaceringen er som standard god.

Publiceringsindstillingerne oprettes, så vælg "Vis alle indstillinger".

Indstil det på følgende måde:

om
Bemærkningerparameternavnsværdi
konfiguration Frigivelse (standard)
Mål-ramme net8.0 (standard)
Implementeringstilstande Afhængighed af rammer Separat for serviceregistreringsmiljøet. Hvis du installerer NEt 8-runtime, er denne indstilling OK.
Målkørsel Win-x64 Hvis operativsystemet er et 32-bit miljø, skal du vælge win-x86
Målret mod placering standard
Oprettelse af en enkelt fil
ReadyToRun-kompilering vilkårlig

Efter indstillingen skal du klikke på knappen "Send".

Hvis "Udgivelsen lykkedes" vises i nederste venstre hjørne, er den fuldført.

Outputfilen kan åbnes ved at klikke på "Target Location".

Programplacering og tilmelding til tjenester

Log ind på det miljø, hvor du vil registrere Windows-tjenesten med administratorrettigheder.

Kopiér den publicerede fil til det miljø, hvor du vil registrere den som en Windows-tjeneste. Du kan placere den i en hvilken som helst mappe, men husk, at Windows-tjenesten altid vil henvise til programmet i den mappe.

Også, hvis den offentliggjorte fil indeholder en fil med filtypenavnet .pdb , må du ikke kopiere den i et miljø, hvor den kan ses af en uspecificeret person, fordi den indeholder udviklingsoplysninger.

Når filen er på plads, skal du registrere den som en Windows-tjeneste. Brug kommandoen til at registrere. Højreklik på Start-menuen og vælg "Terminal (Admin)". Mr./Ms. kører i et Windows 11-miljø, men i andre miljøer er det OK at åbne en kommandoprompt med administratorrettigheder.

I tilfælde af terminalen kan PowerShell være åben først, men PowerShell kan muligvis ikke konfigurere den korrekt, så åbn "Kommandoprompt".

Du kan registrere det med Windows-tjenesten med følgende kommando:

format

sc create "<サービス名>" start=auto binpath="<プログラム(.exe)のパス>"

Eksempel på input

sc create "WindowsServiceDotNet8" start=auto binpath="C:\Service\WindowsServiceDotNet8\WindowsServiceDotNet8.exe"

<サービス名> er det navn, der vises på listen over Windows-tjenester. Du kan angive et separat visningsnavn, men hvis du ikke angiver et visningsnavn, vises dette navn. Det påvirker også registreringsdatabasen, så alfanumeriske tjenestenavne foretrækkes.

start=auto er en indstilling til automatisk at starte tjenesten, når Windows starter. Hvis du vil starte den manuelt, skal du slette denne beskrivelse.

binpath er den fulde sti til programfilerne.

Hvis du udfører kommandoen og [SC] CreateService SUCCESS display, er det vellykket.

De tjenester, du har registreret, skal vises på listen.

Start tjenesten, og kontroller dens funktion

Hvis du vil køre tjenesten, kan du starte den fra serviceskærmen eller med følgende kommando.

sc start <サービス名>

Stopkommandoen er som følger.

sc stop <サービス名>

Hvis du stopper tjenesten, kan du kontrollere, at lukningsprocessen kører.

Føje en beskrivelse til tjenesten

Beskrivelsesfeltet for den tilføjede tjeneste er tomt, men du kan tilføje det med følgende kommando.

sc description <サービス名> "<説明文>"

Sletning af en tjeneste

Hvis du vil slette tjenesten, kan du gøre det med følgende kommando. Du skal have administratorrettigheder ved kommandoprompten.

sc delete <サービス名>