Vytvorenie služby pre Windows v .NET 8
Prevádzkové prostredie
- Visual Studio
-
- Visual Studio 2022
- .SIEŤ
-
- .NET 8
- Windows
-
- Okná 11
Predpoklady
- Visual Studio
-
- Visual Studio 2022
- .SIEŤ
-
- .NET 8
- Windows
-
- Windows 10
- Okná 11
- Windows Server
-
- Windows 2012 alebo novší
Predpokladom
- Visual Studio je už nainštalované
Najskôr
Keď sa pokúsim vytvoriť službu Windows v Visual Studio .NET, existujú iba šablóny .NET Framework. Dá sa vytvoriť aj v .NET (Core) a šablóna sa nazýva "Worker Service".
V tomto článku vysvetlím, ako to použiť na vytvorenie, registráciu a spustenie služby Windows. Obsah spracovania je minimálny, takže ak môžete potvrdiť, že je spustený ako služba systému Windows, vytvorte funkciu.
Vytvorenie projektu
Spustite Visual Studio. Vyberte položku Vytvoriť nový projekt.
Zadajte do vyhľadávacieho poľa サービス
vyššie a potom zo zoznamu vyberte položku Služba pracovníkov.
"Služby systému Windows" je verzia rozhrania .NET Framework, ktorá nemá verziu rozhrania .NET.
Názov a umiestnenie projektu môžu byť ľubovoľné. Nemá to vplyv na službu, do ktorej sa registrujete.
「. NET 8.0 a ponechajte predvolené hodnoty, aby ste ju vytvorili.
Projekt bol vytvorený.
Pridanie knižníc
V počiatočnom stave má iba "servisnú" funkciu a žiadne funkcie špecifické pre Windows. Pridajte knižnicu, ktorú môže používať služba Windowsu z NuGetu.
Kliknite pravým tlačidlom myši na položku Závislosti a vyberte položku Spravovať balíky NuGet.
Vyberte kartu Prehľadávať a zadajte do vyhľadávacieho poľa Microsoft.Extensions.Hosting.WindowsServices
.
Zobrazí sa v zozname, takže ho nainštalujte.
Kliknite na tlačidlo Použiť.
Bol pridaný ako balík.
Editačné programy
Tentokrát vytvorím službu, ktorá pravidelne pridáva text do textového súboru ako pán/pani.
Program.cs
Pridajte funkcie služby Windows nasledovne:
var builder = Host.CreateApplicationBuilder(args);
// ↓ここから追加
builder.Services.AddWindowsService();
// ↑ここまで追加
builder.Services.AddHostedService<Worker>();
var host = builder.Build();
host.Run();
Worker.cs
Názov triedy môžete ľubovoľne zmeniť, ale na tento čas ponecháme predvolené.
V predvolenom nastavení existujú iba metódy, ktoré sa spracúvajú ExecuteAsync
pri spustení služby, ale zmeňme ich nasledovne:
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);
}
}
}
Pridali sme novú metódu a StopAsync
novú StartAsync
metódu.
Ako už názov napovedá, tieto metódy sa volajú pri spustení a zastavení služby.
Obsahom procesu je jednoducho vytváranie priečinkov a písanie textu, takže vysvetlenie vynechám.
ExecuteAsync
Metóda pokračuje v opakovaní so stoppingToken, kým while
nie je označená príznakom na zrušenie.
Pridajte to, čo while
chcete spracovať, keď je služba spustená.
Ak však napíšete iba proces, ktorý chcete presunúť, služba pobeží na plnú kapacitu, preto Task.Delay
je základné ju presunúť počas čakania určitého času s metódou.
V predvolenom nastavení je nastavená na 1 sekundu (1000 ms), preto ju kedykoľvek prepíšte.
ladiť
Môžete ladiť zo sady Visual Studio. Uisťujeme vás, že v skutočnosti nebudete v službe zaregistrovaní.
Po spustení sa zobrazí konzola.
Ak je proces správny, môžete vidieť, že súbor bol vytvorený.
Ak chcete zastaviť ladenie, zatvorte konzolu.
Ak skontrolujete denník, môžete vidieť, že proces spustenia služby prešiel, ale proces ukončenia nie. Ak chcete vidieť ukončenie, musíte sa skutočne zaregistrovať v službe Windows, aby ste ho overili.
vydať
Aby ste sa mohli zaregistrovať v službe systému Windows, musíte program zverejniť. Kliknite pravým tlačidlom myši na projekt a vyberte položku Publikovať.
Vyberte položku Priečinky.
Umiestnenie priečinka je predvolene pekné.
Nastavenia publikovania sa vytvoria, preto vyberte "Zobraziť všetky nastavenia".
Nastavte ho nasledovne:
Názov parametra Poznámky k hodnote | ||
---|---|---|
konfigurácia | Vydanie (predvolené) | |
Cieľový rámec | NET8.0 (predvolené) | |
Režimy nasadenia | Závislosť od rámca | Samostatne pre prostredie registrácie služieb. Ak inštalujete runtime NEt 8, toto nastavenie je v poriadku. |
Cieľový čas spustenia | Win-X64 | Ak je operačný systém 32-bitové prostredie, vyberte win-x86 |
Cieľová poloha | predvolený | |
Vytvorenie jedného súboru | NA | |
Kompilácia ReadyToRun | svojvoľný |
Po nastavení kliknite na tlačidlo "Odoslať".
Ak sa v ľavom dolnom rohu zobrazí "Publikovanie bolo úspešné", je dokončené.
Výstupný súbor je možné otvoriť kliknutím na "Cieľové umiestnenie".
Umiestnenie programu a registrácia v službách
Prihláste sa do prostredia, v ktorom chcete zaregistrovať službu Windows s oprávneniami správcu.
Skopírujte publikovaný súbor do prostredia, v ktorom ho chcete zaregistrovať ako službu systému Windows. Môžete ho umiestniť do ľubovoľného priečinka, ale nezabúdajte, že služba Windows bude vždy odkazovať na program v danom priečinku.
Ak publikovaný súbor obsahuje súbor s príponou .pdb
, nekopírujte ho v prostredí, kde ho môže vidieť nešpecifikovaná osoba, pretože obsahuje informácie o vývoji.
Keď je súbor na svojom mieste, zaregistrujte ho ako službu systému Windows. Pomocou príkazu sa zaregistrujte. Kliknite pravým tlačidlom myši na ponuku Štart a vyberte "Terminál (správca)". Mr./Ms. beží v prostredí Windows 11, ale v iných prostrediach je v poriadku otvoriť príkazový riadok s oprávneniami správcu.
V prípade terminálu môže byť PowerShell otvorený ako prvý, ale PowerShell ho nemusí byť schopný správne nastaviť, preto otvorte "Príkazový riadok".
Môžete ho zaregistrovať v službe Windows pomocou nasledujúceho príkazu:
formát
sc create "<サービス名>" start=auto binpath="<プログラム(.exe)のパス>"
Príklad vstupu
sc create "WindowsServiceDotNet8" start=auto binpath="C:\Service\WindowsServiceDotNet8\WindowsServiceDotNet8.exe"
<サービス名>
je názov, ktorý sa zobrazuje v zozname služieb systému Windows. Môžete nastaviť samostatný zobrazovaný názov, ale ak nezadáte zobrazovaný názov, zobrazí sa tento názov.
Ovplyvňuje to aj databázu Registry, preto sa uprednostňujú alfanumerické názvy služieb.
start=auto
je nastavenie automatického spustenia služby pri spustení systému Windows.
Ak ho chcete spustiť manuálne, odstráňte tento popis.
binpath
je úplná cesta k programovým súborom.
Ak vykonáte príkaz a [SC] CreateService SUCCESS
zobrazíte , je to úspešné.
Služby, ktoré ste si zaregistrovali, by sa mali zobraziť v zozname.
Spustite službu a skontrolujte jej fungovanie
Ak chcete službu spustiť, môžete ju spustiť z obrazovky služby alebo pomocou nasledujúceho príkazu.
sc start <サービス名>
Príkaz stop je nasledovný.
sc stop <サービス名>
Ak službu zastavíte, môžete overiť, či je spustený proces vypnutia.
Pridanie popisu do služby
Pole popisu pridanej služby je prázdne, ale môžete ho pridať pomocou nasledujúceho príkazu.
sc description <サービス名> "<説明文>"
Odstránenie služby
Ak chcete službu odstrániť, môžete tak urobiť pomocou nasledujúceho príkazu. V príkazovom riadku musíte mať oprávnenia správcu.
sc delete <サービス名>