Pakalpojuma izveide operētājsistēmai Windows operētājsistēmā .NET 8

Lapa atjaunota :
Lapas izveides datums :

Darbības vide

Visual Studio
  • Visual Studio 2022
.NETO
  • .NET 8
Windows
  • Operētājsistēmā Windows 11

Priekšnoteikumi

Visual Studio
  • Visual Studio 2022
.NETO
  • .NET 8
Windows
  • Operētājsistēmā Windows 10
  • Operētājsistēmā Windows 11
Windows Server
  • Windows 2012 vai jaunāka versija

Priekšnosacījumu

  • Visual Studio jau ir instalēta

Sākumā

Mēģinot izveidot Windows pakalpojumu programmā Visual Studio .NET, ir tikai .NET Framework veidnes. To var izveidot arī .NET (Core), un veidnes nosaukums ir "Worker Service".

Šajā rakstā es paskaidrošu, kā to izmantot, lai izveidotu, reģistrētu un palaistu Windows pakalpojumu. Apstrādes saturs ir minimāls, tādēļ, ja varat apstiprināt, ka tas darbojas kā Windows pakalpojums, lūdzu, izveidojiet šo funkciju.

Izveidojiet projektu

Startējiet programmu Visual Studio. Atlasiet Izveidot jaunu projektu.

Ievadiet iepriekš redzamajā サービス meklēšanas laukā un pēc tam sarakstā atlasiet Darbinieku apkalpošana. "Windows pakalpojumi" ir .NET Framework versija, kurai nav .NET versijas.

Projekta nosaukums un atrašanās vieta var būt patvaļīga. Tas neietekmē pakalpojumu, kuram reģistrējaties.

「. Ir atlasīts NET 8.0 un atstājiet noklusējumus, lai to izveidotu.

Projekts ir izveidots.

Bibliotēku pievienošana

Sākotnējā stāvoklī tam ir tikai "pakalpojuma" funkcija un nav Windows specifisku funkciju. Pievienojiet bibliotēku, ko var izmantot Windows pakalpojums no NuGet.

Ar peles labo pogu noklikšķiniet uz Atkarības un atlasiet Pārvaldīt NuGet pakotnes.

Atlasiet cilni Pārlūkot un ievadiet Microsoft.Extensions.Hosting.WindowsServices meklēšanas laukā. Tas parādīsies sarakstā, tāpēc instalējiet to.

Noklikšķiniet uz Lietot.

Tas tika pievienots kā pakete.

Programmu rediģēšana

Šoreiz es izveidošu pakalpojumu, kas periodiski pievieno tekstu teksta failam kā Mr./Ms..

Program.cs

Pievienojiet Windows pakalpojuma funkcionalitāti šādi:

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

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

Worker.cs

Jūs varat patvaļīgi mainīt klases nosaukumu, bet šoreiz mēs atstāsim noklusējumu.

Pēc noklusējuma ir tikai metodes, kas tiek ExecuteAsync apstrādātas, kad pakalpojums tiek izpildīts, bet mainīsim to šādi:

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

Mēs esam pievienojuši jaunu metodi un StopAsync jaunu StartAsync metodi. Kā norāda nosaukums, šīs metodes tiek sauktas, kad pakalpojums tiek uzsākts un kad tas tiek pārtraukts. Procesa saturs ir vienkārši mapju izveide un teksta rakstīšana, tāpēc es izlaidīšu skaidrojumu.

ExecuteAsync Metode turpina cilpu ar stopToken, līdz while tā tiek atzīmēta atcelšanai. Pievienojiet to, ko while vēlaties apstrādāt pakalpojuma darbības laikā. Tomēr, ja rakstāt tikai procesu, kuru vēlaties pārvietot, pakalpojums darbosies ar pilnu jaudu, tāpēc Task.Delay ir pamata to pārvietot, gaidot noteiktu laiku ar šo metodi. Pēc noklusējuma tas ir iestatīts uz 1 sekundi (1000ms), tāpēc, lūdzu, pārrakstiet to jebkurā laikā.

Atkļūdošanas

Jūs varat atkļūdot no Visual Studio. Varat būt drošs, ka jūs faktiski netiksiet reģistrēts pakalpojumā.

Palaižot to, parādīsies konsole.

Ja process ir pareizs, varat redzēt, ka fails ir izveidots.

Ja vēlaties pārtraukt atkļūdošanu, aizveriet konsoli.

Pārbaudot žurnālu, jūs varat redzēt, ka pakalpojuma sākšanas process ir pagājis, bet pārtraukšanas process nav pagājis. Lai redzētu izbeigšanu, jums faktiski jāreģistrējas Windows pakalpojumā, lai to pārbaudītu.

jautājums

Lai varētu reģistrēties Windows pakalpojumā, jums ir jāpublicē programma. Ar peles labo pogu noklikšķiniet uz projekta un izvēlieties Publicēt.

Atlasiet Mapes.

Mapes atrašanās vieta pēc noklusējuma ir jauka.

Tiks izveidoti publicēšanas iestatījumi, tāpēc atlasiet "Rādīt visus iestatījumus".

Iestatiet to šādi:

Parametra nosaukums Vērtības piezīmes
Konfigurācijas Laidiens (noklusējums)
Mērķa sistēma net8.0 (noklusējums)
Izvietošanas režīmi Atkarība no sistēmas Atsevišķi pakalpojumu reģistrācijas videi. Ja instalējat NEt 8 izpildlaiku, šis iestatījums ir labi.
Mērķa izpildlaiks WIN-x64 Ja OS ir 32 bitu vide, atlasiet win-x86
Mērķa atrašanās vieta Noklusējuma
Viena faila izveide IESLĒGTS
ReadyToRun kompilācija Patvaļīgu

Pēc iestatīšanas noklikšķiniet uz pogas "Iesniegt".

Ja apakšējā kreisajā stūrī tiek parādīts "Publicēšana bija veiksmīga", tas ir pabeigts.

Izvades failu var atvērt, noklikšķinot uz "Mērķa atrašanās vieta".

Programmu izvietošana un reģistrācija pakalpojumos

Piesakieties vidē, kurā vēlaties reģistrēt Windows pakalpojumu ar administratora tiesībām.

Kopējiet publicēto failu vidē, kurā vēlaties to reģistrēt kā Windows pakalpojumu. To var ievietot jebkurā mapē, taču ņemiet vērā, ka Windows pakalpojums vienmēr atsauksies uz programmu šajā mapē.

Arī tad, ja publicētajā failā ir fails ar paplašinājumu .pdb , nekopējiet to vidē, kur to var redzēt nenoteikta persona, jo tajā ir informācija par attīstību.

Kad fails ir ievietots, reģistrējiet to kā Windows pakalpojumu. Izmantojiet komandu, lai reģistrētos. Ar peles labo pogu noklikšķiniet uz izvēlnes Sākt un atlasiet "Terminal (Admin)". Mr./Ms. darbojas Windows 11 vidē, bet citās vidēs ir pareizi atvērt komandu uzvedni ar administratora privilēģijām.

Termināļa gadījumā PowerShell var būt atvērts vispirms, bet PowerShell, iespējams, nevarēs to pareizi iestatīt, tāpēc atveriet "Komandu uzvedni".

To var reģistrēt Windows pakalpojumā ar šādu komandu:

Formātā

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

Ievades piemērs

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

<サービス名> ir nosaukums, kas tiek parādīts Windows pakalpojumu sarakstā. Varat iestatīt atsevišķu parādāmo vārdu, bet, ja nenorādīsit parādāmo vārdu, šis vārds tiks parādīts. Tas ietekmē arī reģistru, tāpēc priekšroka tiek dota burtciparu pakalpojumu nosaukumiem.

start=auto ir iestatījums, lai automātiski startētu pakalpojumu, startējot sistēmu Windows. Ja vēlaties to sākt manuāli, izdzēsiet šo aprakstu.

binpath ir pilns programmas failu ceļš.

Ja izpildāt komandu un [SC] CreateService SUCCESS parādāt , tas ir veiksmīgs.

Jūsu reģistrētajiem pakalpojumiem ir jābūt redzamiem sarakstā.

Sāciet pakalpojumu un pārbaudiet tā darbību

Ja vēlaties palaist pakalpojumu, varat to startēt no servisa ekrāna vai ar šādu komandu.

sc start <サービス名>

Apturēšanas komanda ir šāda.

sc stop <サービス名>

Ja pārtraucat pakalpojuma sniegšanu, varat pārbaudīt, vai izslēgšanas process darbojas.

Apraksta pievienošana pakalpojumam

Pievienotā pakalpojuma apraksta lauks ir tukšs, bet to var pievienot ar šādu komandu.

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

Pakalpojuma dzēšana

Ja vēlaties dzēst pakalpojumu, varat to izdarīt ar šādu komandu. Komandu uzvednē ir jābūt administratora tiesībām.

sc delete <サービス名>