Opret en tjeneste til Windows i .NET 8
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:
omBemærkninger | parameternavnsvæ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 | PÅ | |
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 <サービス名>