Ustvarjanje storitve za Windows v .NET 8
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 <サービス名>