Windows-palvelun luominen .NET 8:ssa

Sivu päivitetty :
Sivun luontipäivämäärä :

Toimintaympäristö

Visuaalinen studio
  • Visuaalinen studio 2022
.VERKKO
  • .NET 8
Windows
  • Windows 11

Edellytykset

Visuaalinen studio
  • Visuaalinen studio 2022
.VERKKO
  • .NET 8
Windows
  • Windows 10
  • Windows 11
Windows Server
  • Windows 2012 tai uudempi

edellytys

  • Visual Studio on jo asennettu

Alun perin

Kun yritän luoda Windows-palvelun Visual Studio .NET:ssä, siellä on vain .NET Framework -malleja. Se voidaan luoda myös .NET: ssä (Core), ja mallin nimi on "Worker Service".

Tässä artikkelissa selitän, kuinka tätä käytetään Windows-palvelun luomiseen, rekisteröintiin ja suorittamiseen. Käsittelysisältö on minimaalinen, joten jos voit vahvistaa, että se toimii Windows-palveluna, luo toiminto.

Luo projekti

Käynnistä Visual Studio. Valitse Luo uusi projekti.

Kirjoita yllä olevaan hakukenttään サービス ja valitse sitten luettelosta Työntekijän palvelu. "Windows-palvelut" on .NET Framework -versio, jolla ei ole .NET-versiota.

Projektin nimi ja sijainti voivat olla mielivaltaisia. Se ei vaikuta palveluun, johon olet rekisteröitymässä.

「. NET 8.0 on valittuna ja jätä oletusasetukset sen luomista varten.

Projekti on luotu.

Kirjastojen lisääminen

Alkutilassa sillä on vain "palvelu" -toiminto eikä Windows-kohtaisia toimintoja. Lisää kirjasto, jota Windows-palvelu voi käyttää NuGetista.

Napsauta hiiren kakkospainikkeella Riippuvuudet ja valitse NuGet-pakettien hallinta.

Valitse Selaa-välilehti ja kirjoita hakukenttään Microsoft.Extensions.Hosting.WindowsServices . Se näkyy luettelossa, joten asenna se.

Klikkaa Käytä.

Se lisättiin pakettina.

Ohjelmien muokkaaminen

Tällä kertaa luon palvelun, joka lisää ajoittain tekstiä tekstitiedostoon Mr./Ms.:nä.

Program.cs

Lisää Windows-palvelun toiminnot seuraavasti:

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

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

Worker.cs

Voit muuttaa luokan nimeä mielivaltaisesti, mutta tällä kertaa jätämme oletusarvon.

Oletusarvoisesti on vain menetelmiä, joita ExecuteAsync käsitellään, kun palvelu suoritetaan, mutta muutetaan sitä seuraavasti:

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);
    }
  }
}

Olemme lisänneet uuden menetelmän ja StopAsync uuden StartAsync menetelmän. Kuten nimestä käy ilmi, näitä menetelmiä kutsutaan, kun palvelu käynnistetään ja kun se pysäytetään. Prosessin sisältö on yksinkertaisesti kansioiden luominen ja tekstin kirjoittaminen, joten jätän selityksen pois.

ExecuteAsync Menetelmä jatkaa silmukkaa stoppingTokenin kanssa, kunnes while se merkitään peruutettavaksi. Lisää, mitä while haluat käsiteltävän, kun palvelu on käynnissä. Jos kuitenkin kirjoitat vain prosessin, jonka haluat siirtää, palvelu toimii täydellä kapasiteetilla, joten Task.Delay on perustärkeää siirtää sitä odottaessasi tiettyä aikaa menetelmällä. Oletuksena se on asetettu 1 sekuntiin (1000 ms), joten kirjoita se uudelleen milloin tahansa.

debugata

Voit tehdä virheenkorjauksen Visual Studiosta. Voit olla varma, että et itse asiassa rekisteröidy palveluun.

Kun suoritat sen, konsoli tulee näkyviin.

Jos prosessi on oikea, näet, että tiedosto on luotu.

Jos haluat lopettaa virheenkorjauksen, sulje konsoli.

Jos tarkistat lokin, näet, että palvelun käynnistysprosessi on kulunut, mutta lopetusprosessi ei. Jos haluat nähdä irtisanomisen, sinun on rekisteröidyttävä Windows-palveluun vahvistaaksesi sen.

ongelma

Jotta voit rekisteröityä Windows-palveluun, sinun on julkaistava ohjelma. Napsauta projektia hiiren kakkospainikkeella ja valitse Julkaise.

Valitse Kansiot.

Kansion sijainti on oletusarvoisesti mukava.

Julkaisuasetukset luodaan, joten valitse "Näytä kaikki asetukset".

Määritä se seuraavasti:

Parametrin nimen arvo Huomautuksia
konfiguraatio Release (oletus)
Kohde-kehys Net8.0 (oletus)
Käyttöönottotavat Riippuvuus kehyksestä Erikseen palvelun rekisteröintiympäristölle. Jos asennat NEt 8 runtimea, tämä asetus on OK.
Ajonaikatavoite Win-X64 Jos käyttöjärjestelmä on 32-bittinen ympäristö, valitse win-x86
Kohteen sijainti laiminlyönti
Yhden tiedoston luominen PÄÄLLE
ReadyToRun-kokoelma mielivaltainen

Asetuksen tekemisen jälkeen napsauta "Lähetä" -painiketta.

Jos vasemmassa alakulmassa näkyy "Julkaiseminen onnistui", se on valmis.

Tulostetiedosto voidaan avata napsauttamalla "Kohdesijainti".

Ohjelman sijoittaminen ja palveluihin ilmoittautuminen

Kirjaudu ympäristöön, johon haluat rekisteröidä Windows-palvelun järjestelmänvalvojan oikeuksilla.

Kopioi julkaistu tiedosto ympäristöön, johon haluat rekisteröidä sen Windows-palveluna. Voit sijoittaa sen mihin tahansa kansioon, mutta muista, että Windows-palvelu viittaa aina kyseisessä kansiossa olevaan ohjelmaan.

Lisäksi, jos julkaistu tiedosto sisältää tiedoston, jonka tunniste .pdb on , älä kopioi sitä ympäristössä, jossa määrittelemätön henkilö voi nähdä sen, koska se sisältää kehitystietoja.

Kun tiedosto on paikallaan, rekisteröi se Windows-palveluna. Käytä komentoa rekisteröityäksesi. Napsauta hiiren kakkospainikkeella Käynnistä-valikkoa ja valitse "Terminal (Admin)". Mr./Ms. toimii Windows 11 -ympäristössä, mutta muissa ympäristöissä on OK avata komentokehote järjestelmänvalvojan oikeuksilla.

Päätelaitteen tapauksessa PowerShell voi olla ensin auki, mutta PowerShell ei ehkä pysty määrittämään sitä oikein, joten avaa komentokehote.

Voit rekisteröidä sen Windows-palveluun seuraavalla komennolla:

formaatti

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

Esimerkki syötteestä

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

<サービス名> on nimi, joka näkyy Windows-palveluiden luettelossa. Voit määrittää erillisen näyttönimen, mutta jos et määritä näyttönimeä, tämä nimi näytetään. Se vaikuttaa myös rekisteriin, joten aakkosnumeeriset palvelunimet ovat suositeltavia.

start=auto on asetus, joka käynnistää palvelun automaattisesti, kun Windows käynnistyy. Jos haluat käynnistää sen manuaalisesti, poista tämä kuvaus.

binpath on ohjelmatiedostojen koko polku.

Jos suoritat komennon ja [SC] CreateService SUCCESS näytät , se onnistuu.

Rekisteröimiesi palveluiden pitäisi näkyä luettelossa.

Käynnistä palvelu ja tarkista sen toiminta

Jos haluat suorittaa palvelun, voit käynnistää sen palvelunäytöstä tai seuraavalla komennolla.

sc start <サービス名>

Pysäytyskomento on seuraava.

sc stop <サービス名>

Jos pysäytät palvelun, voit varmistaa, että sammutusprosessi on käynnissä.

Lisää palveluun kuvaus

Lisätyn palvelun kuvauskenttä on tyhjä, mutta voit lisätä sen seuraavalla komennolla.

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

Palvelun poistaminen

Jos haluat poistaa palvelun, voit tehdä sen seuraavalla komennolla. Sinulla on oltava järjestelmänvalvojan oikeudet komentokehotteessa.

sc delete <サービス名>