Looge Windowsi jaoks teenus .NET 8-s

Lehekülg uuendatud :
Lehe loomise kuupäev :

Töökeskkond

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

Eeltingimused

Visuaalne stuudio
  • Visual Studio 2022
.NET
  • .NET 8
Windows
  • Windows 10
  • Windows 11
Windows Server
  • Windows 2012 või uuem

eeltingimus

  • Visual Studio on juba installitud

Alguses

Kui proovin luua Windowsi teenust Visual Studio .NET-is, on ainult .NET Frameworki mallid. Seda saab luua ka .NET (Core) ja malli nimi on "Worker Service".

Selles artiklis selgitan, kuidas seda kasutada Windowsi teenuse loomiseks, registreerimiseks ja käitamiseks. Töötlemissisu on minimaalne, nii et kui saate kinnitada, et see töötab Windowsi teenusena, looge see funktsioon.

Projekti loomine

Käivitage Visual Studio. Valige Loo uus projekt.

Sisestage ülaltoodud otsinguväljale サービス ja seejärel valige loendist Töötaja teenus. "Windowsi teenused" on .NET Frameworki versioon, millel ei ole .NET versiooni.

Projekti nimi ja asukoht võivad olla suvalised. See ei mõjuta teenust, mille kasutajaks registreerute.

「. NET 8.0 on valitud ja jätke vaikeväärtused selle loomiseks.

Projekt on loodud.

Teekide lisamine

Esialgses olekus on sellel ainult "teenuse" funktsioon ja puuduvad Windowsi spetsiifilised funktsioonid. Lisage teek, mida saab kasutada NuGeti Windowsi teenuses.

Paremklõpsake sõltuvusi ja valige NuGeti pakettide haldamine.

Valige vahekaart Sirvi ja sisestage otsinguväljale Microsoft.Extensions.Hosting.WindowsServices . See ilmub loendisse, nii et installige see.

Klõpsake nuppu Apply (Rakenda).

See lisati paketina.

Programmide redigeerimine

Seekord loon teenuse, mis lisab perioodiliselt teksti tekstifailile hr/pr.

Program.cs

Lisage Windowsi teenuse funktsionaalsus järgmiselt:

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

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

Worker.cs

Klassi nime saate meelevaldselt muuta, kuid seekord jätame vaikimisi.

Vaikimisi on teenuse täitmisel ainult meetodeid, mida ExecuteAsync töödeldakse, kuid muudame seda järgmiselt:

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

Lisasime uue meetodi ja StopAsync uue StartAsync meetodi. Nagu nimigi ütleb, kutsutakse neid meetodeid teenuse käivitamisel ja selle peatamisel. Protsessi sisu on lihtsalt kaustade loomine ja teksti kirjutamine, nii et ma jätan selgituse välja.

ExecuteAsync Meetod jätkab stopingTokeniga silmust, kuni while see on tühistamiseks lipuga märgitud. Lisage, mida while soovite teenuse töötamise ajal töödelda. Kui aga kirjutate ainult protsessi, mida soovite teisaldada, töötab teenus täisvõimsusel, seega Task.Delay on põhiline seda meetodiga teatud aega oodates teisaldada. Vaikimisi on selle väärtuseks seatud 1 sekund (1000 ms), nii et palun kirjutage see igal ajal ümber.

Debug

Saate siluda Visual Studiost. Võite olla kindel, et teid ei registreerita tegelikult teenuses.

Selle käivitamisel ilmub konsool.

Kui protsess on õige, näete, et fail on loodud.

Kui soovite silumise lõpetada, sulgege konsool.

Kui kontrollite logi, näete, et teenuse käivitamise protsess on möödas, kuid lõpetamisprotsess pole seda teinud. Lõpetamise nägemiseks peate selle kontrollimiseks tegelikult Windowsi teenuses registreeruma.

Küsimus

Windowsi teenuses registreerumiseks peate programmi avaldama. Paremklõpsake projekti ja valige käsk Avalda.

Valige Kaustad.

Kausta asukoht on vaikimisi kena.

Luuakse avaldamisseaded, seega valige "Näita kõiki seadeid".

Seadistage see järgmiselt.

Parameetri nimi Väärtus Märkused
Konfiguratsiooni Vabastamine (vaikimisi)
Sihtraamistik net8.0 (vaikimisi)
Juurutusrežiimid Raamistiku sõltuvus Teenuse registreerimise keskkonna jaoks eraldi. Kui installite NEt 8 käitusaega, on see säte OK.
Käitusaja eesmärk Win-X64 Kui operatsioonisüsteem on 32-bitine keskkond, valige win-x86
Sihtkoha asukoht Vaikimisi
Ühe faili loomine SEES
ReadyToRun kompileerimine Meelevaldne

Pärast seadistamist klõpsake nuppu "Esita".

Kui vasakus alanurgas kuvatakse teade "Kirjastamine õnnestus", on see lõpetatud.

Väljundfaili saab avada, klõpsates "Target Location".

Programmi paigutamine ja teenustesse registreerimine

Logige sisse keskkonda, kus soovite Windowsi teenuse administraatori õigustega registreerida.

Kopeerige avaldatud fail keskkonda, kus soovite selle Windowsi teenusena registreerida. Võite selle paigutada mis tahes kausta, kuid pidage meeles, et Windowsi teenus viitab alati selles kaustas olevale programmile.

Samuti, kui avaldatud fail sisaldab laiendiga .pdb faili , ärge kopeerige seda keskkonda, kus seda näeb määratlemata isik, kuna see sisaldab arendusteavet.

Kui fail on paigas, registreerige see Windowsi teenusena. Registreerimiseks kasutage käsku. Paremklõpsake menüüd Start ja valige "Terminal (Admin)". Mr./Ms. töötab Windows 11 keskkonnas, kuid teistes keskkondades on administraatori õigustega käsurea avamine OK.

Terminali puhul võib PowerShell olla kõigepealt avatud, kuid PowerShell ei pruugi seda õigesti seadistada, nii et avage "Command Prompt".

Saate selle Windowsi teenuses registreerida järgmise käsuga:

Formaat

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

Sisendi näide

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

<サービス名> on nimi, mis kuvatakse Windowsi teenuste loendis. Saate määrata eraldi kuvatava nime, kuid kui te kuvatavat nime ei määra, kuvatakse see nimi. See mõjutab ka registrit, seega eelistatakse tähtnumbrilisi teenusenimesid.

start=auto on säte teenuse automaatseks käivitamiseks Windowsi käivitamisel. Kui soovite selle käsitsi käivitada, kustutage see kirjeldus.

binpath on programmifailide täielik tee.

Kui täidate käsku ja [SC] CreateService SUCCESS kuvate , on see edukas.

Teie registreeritud teenused peaksid olema loendis.

Käivitage teenus ja kontrollige selle toimimist

Kui soovite teenust käivitada, saate selle käivitada teenuse ekraanilt või järgmise käsuga.

sc start <サービス名>

Stoppkäsklus on järgmine.

sc stop <サービス名>

Kui peatate teenuse, saate kontrollida, kas sulgemisprotsess töötab.

Teenusele kirjelduse lisamine

Lisatud teenuse kirjelduse väli on tühi, kuid saate selle lisada järgmise käsuga.

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

Teenuse kustutamine

Kui soovite teenuse kustutada, saate seda teha järgmise käsuga. Teil peavad käsureal olema administraatori õigused.

sc delete <サービス名>