Ustvarjanje storitve za Windows v .NET 8

Stran posodobljena :
Datum ustvarjanja strani :

Delovno okolje

Visual Studio
  • Visual Studio 2022
.MREŽA
  • .NET 8
Windows
  • Okna 11

Predpogoji

Visual Studio
  • Visual Studio 2022
.MREŽA
  • .NET 8
Windows
  • Operacijski sistem Windows 10
  • Okna 11
Windows Server
  • Windows 2012 ali novejša različica

Pogoj

  • Visual Studio je že nameščen

Sprva

Ko poskušam ustvariti storitev sistema Windows v programu Visual Studio .NET, so na voljo le predloge ogrodja .NET Framework. Ustvarite ga lahko tudi v .NET (Core), predloga pa se imenuje »Worker Service«.

V tem članku bom razložil, kako to uporabiti za ustvarjanje, registracijo in zagon storitve Windows. Vsebina obdelave je minimalna, zato če lahko potrdite, da se izvaja kot storitev Windows, ustvarite funkcijo.

Ustvarjanje projekta

Zaženite Visual Studio. Izberite Ustvari nov projekt.

Vnesite v zgornje iskalno サービス polje in nato na seznamu izberite Storitev za delavce. »Storitve sistema Windows« je različica ogrodja .NET Framework, ki nima različice .NET.

Ime in lokacija projekta sta lahko poljubna. Ne vpliva na storitev, za katero se registrirate.

「. NET 8.0 in pustite privzete nastavitve, da jo ustvarite.

Projekt je bil ustvarjen.

Dodajanje knjižnic

V začetnem stanju ima samo funkcijo »storitve« in brez funkcij, specifičnih za Windows. Dodajte knjižnico, ki jo lahko uporablja storitev sistema Windows iz NuGeta.

Z desno tipko miške kliknite Odvisnosti in izberite Upravljanje paketov NuGet.

Izberite zavihek Brskanje in vnesite v iskalno Microsoft.Extensions.Hosting.WindowsServices polje. Pojavil se bo na seznamu, zato ga namestite.

Kliknite Uporabi.

Dodan je bil kot paket.

Urejanje programov

Tokrat bom ustvaril storitev, ki občasno dodaja besedilo v besedilno datoteko kot gospod / gospa.

Program.cs

Dodajte funkcionalnost storitve Windows, kot sledi:

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

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

Worker.cs

Ime razreda lahko spremenite poljubno, toda za ta čas bomo pustili privzeto.

Privzeto obstajajo samo metode, ki se ExecuteAsync obdelajo, ko se storitev izvede, vendar jih spremenimo na naslednji način:

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

Dodali smo novo metodo in StopAsync novo StartAsync metodo. Kot že ime pove, se te metode kličejo, ko se storitev zažene in ko se ustavi. Vsebina postopka je preprosto ustvarjanje map in pisanje besedila, zato bom izpustil razlago.

ExecuteAsync Metoda se nadaljuje z zanko stoppingToken, dokler while ni označena z zastavico za preklic. Dodajte, kaj while želite obdelati, ko se storitev izvaja. Če pa napišete samo postopek, ki ga želite premakniti, bo storitev delovala s polno zmogljivostjo, zato Task.Delay je osnovno, da jo premaknete med čakanjem določenega časa z metodo. Privzeto je nastavljena na 1 sekundo (1000 ms), zato jo lahko kadar koli prepišete.

Debug

Odpravljanje napak lahko najdete v programu Visual Studio. Bodite prepričani, da dejansko ne boste registrirani v storitvi.

Ko jo zaženete, se prikaže konzola.

Če je postopek pravilen, lahko vidite, da je bila datoteka ustvarjena.

Če želite ustaviti odpravljanje napak, zaprite konzolo.

Če preverite dnevnik, lahko vidite, da je postopek zagona storitve potekel, postopek prekinitve pa ne. Če si želite ogledati prekinitev, se morate dejansko registrirati v storitvi Windows, da jo preverite.

vprašanje

Če se želite registrirati v storitvi Windows, morate objaviti program. Z desno tipko miške kliknite projekt in izberite Objavi.

Izberite Mape.

Lokacija mape je privzeto lepa.

Nastavitve objavljanja bodo ustvarjene, zato izberite »Pokaži vse nastavitve«.

Nastavite ga na naslednji način:

Ime parametra Opombe o vrednosti
Konfiguracijo Izdaja (privzeto)
Ciljni okvir NET8.0 (privzeto)
Načini uvajanja Odvisnost ogrodja Ločeno za okolje za registracijo storitev. Če nameščate izvajalnik NEt 8, je ta nastavitev v redu.
Ciljni čas izvajanja WIN-x64 Če je operacijski sistem 32-bitno okolje, izberite win-x86
Ciljna lokacija Privzeto
Ustvarjanje ene datoteke NA
Kompilacija ReadyToRun Samovoljno

Po nastavitvi kliknite gumb »Pošlji«.

Če je v spodnjem levem kotu prikazano »Objavljanje je bilo uspešno«, je končano.

Izhodno datoteko lahko odprete s klikom na »Ciljna lokacija«.

Umestitev programa in vpis v storitve

Prijavite se v okolje, v katerem želite registrirati storitev Windows s skrbniškimi pravicami.

Kopirajte objavljeno datoteko v okolje, v katerem jo želite registrirati kot storitev sistema Windows. Postavite ga lahko v katero koli mapo, vendar ne pozabite, da se bo storitev Windows vedno sklicevala na program v tej mapi.

Če objavljena datoteka vsebuje datoteko s pripono .pdb , je ne kopirajte v okolje, kjer jo lahko vidi nedoločena oseba, ker vsebuje informacije o razvoju.

Ko je datoteka na mestu, jo registrirajte kot storitev sistema Windows. Uporabite ukaz za registracijo. Z desno miškino tipko kliknite meni Start in izberite »Terminal (Admin)«. Gospod / gospa deluje v okolju Windows 11, v drugih okoljih pa je v redu odpreti ukazni poziv s skrbniškimi pravicami.

V primeru terminala je lahko PowerShell najprej odprt, vendar ga PowerShell morda ne bo mogel pravilno nastaviti, zato odprite »Ukazni poziv«.

Registrirate ga lahko v storitvi Windows z naslednjim ukazom:

oblika zapisa

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

Primer vnosa

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

<サービス名> je ime, ki je prikazano na seznamu storitev sistema Windows. Nastavite lahko ločeno prikazano ime, če pa ne določite prikaznega imena, bo to ime prikazano. Vpliva tudi na register, zato so prednostna alfanumerična imena storitev.

start=auto je nastavitev za samodejni zagon storitve ob zagonu sistema Windows. Če ga želite zagnati ročno, izbrišite ta opis.

binpath je celotna pot programskih datotek.

Če izvedete ukaz in [SC] CreateService SUCCESS prikažete , je uspešen.

Storitve, ki ste jih registrirali, bi morale biti prikazane na seznamu.

Zaženite storitev in preverite njeno delovanje

Če želite zagnati storitev, jo lahko zaženete na zaslonu storitve ali z naslednjim ukazom.

sc start <サービス名>

Ukaz za zaustavitev je naslednji.

sc stop <サービス名>

Če ustavite storitev, lahko preverite, ali se postopek zaustavitve izvaja.

Dodajanje opisa storitvi

Polje z opisom dodane storitve je prazno, vendar ga lahko dodate z naslednjim ukazom.

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

Brisanje storitve

Če želite izbrisati storitev, lahko to storite z naslednjim ukazom. V ukaznem pozivu morate imeti skrbniške pravice.

sc delete <サービス名>