Vytvoření služby pro Windows v .NET 8
Provozní prostředí
- Visual Studio
-
- Visual Studio 2022
- .SÍŤ
-
- .NET 8
- Windows
-
- Systém Windows 11
Požadavky
- Visual Studio
-
- Visual Studio 2022
- .SÍŤ
-
- .NET 8
- Windows
-
- Systém Windows 10
- Systém Windows 11
- Windows Server
-
- Windows 2012 nebo novější
předpoklad
- Visual Studio je už nainstalované.
Nejprve
Když se pokusím vytvořit službu systému Windows v aplikaci Visual Studio .NET, jsou k dispozici pouze šablony rozhraní .NET Framework. Dá se také vytvořit v .NET (Core) a šablona má název "Worker Service".
V tomto článku vysvětlím, jak to použít k vytvoření, registraci a spuštění služby Windows. Obsah zpracování je minimální, takže pokud můžete potvrdit, že běží jako služba systému Windows, vytvořte funkci.
Vytvoření projektu
Spusťte Visual Studio. Vyberte Vytvořit nový projekt.
Zadejte do サービス
vyhledávacího pole výše a pak ze seznamu vyberte Služba pracovního procesu.
"Služby systému Windows" je verze rozhraní .NET Framework, která nemá verzi .NET.
Název a umístění projektu může být libovolné. Nemá to vliv na službu, ke které se registrujete.
「. NET 8.0 a ponechte výchozí hodnoty pro jeho vytvoření.
Projekt byl vytvořen.
Přidávání knihoven
V počátečním stavu má pouze funkci "služba" a žádné funkce specifické pro Windows. Přidejte knihovnu, kterou může používat služba Windows z NuGetu.
Klikněte pravým tlačítkem na Závislosti a vyberte Spravovat balíčky NuGet.
Vyberte kartu Procházet a zadejte ji do Microsoft.Extensions.Hosting.WindowsServices
vyhledávacího pole.
Zobrazí se v seznamu, takže jej nainstalujte.
Klikněte na tlačítko Použít.
Byl přidán jako balíček.
Editace programů
Tentokrát vytvořím službu, která bude pravidelně přidávat text do textového souboru jako pan/paní.
Program.cs
Přidejte funkce služby systému Windows následujícím způsobem:
var builder = Host.CreateApplicationBuilder(args);
// ↓ここから追加
builder.Services.AddWindowsService();
// ↑ここまで追加
builder.Services.AddHostedService<Worker>();
var host = builder.Build();
host.Run();
Worker.cs
Název třídy můžete libovolně změnit, ale pro tentokrát ponecháme výchozí nastavení.
Ve výchozím nastavení existují pouze metody, které jsou ExecuteAsync
zpracovány při spuštění služby, ale změňme je následujícím způsobem:
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);
}
}
}
Přidali jsme novou metodu a StopAsync
novou StartAsync
metodu.
Jak název napovídá, tyto metody jsou volány při spuštění služby a při jejím zastavení.
Obsahem procesu je jednoduše vytváření složek a psaní textu, takže vynechám vysvětlení.
ExecuteAsync
Metoda pokračuje ve smyčce se stoppingToken, dokud while
není označena příznakem pro zrušení.
Přidejte, co while
chcete zpracovávat, když je služba spuštěná.
Pokud však napíšete pouze proces, který chcete přesunout, služba poběží na plný výkon, takže Task.Delay
je základní ji přesunout a počkat na určitou dobu s metodou.
Ve výchozím nastavení je nastavena na 1 sekundu (1000 ms), proto ji prosím kdykoli přepište.
ladicí
Můžete ladit ze sady Visual Studio. Ujišťujeme vás, že ve skutečnosti nebudete ve službě zaregistrováni.
Když jej spustíte, zobrazí se konzole.
Pokud je proces správný, můžete vidět, že soubor byl vytvořen.
Pokud chcete ladění zastavit, zavřete konzolu.
Pokud se podíváte do protokolu, uvidíte, že proces spuštění služby proběhl úspěšně, ale proces ukončení nikoli. Chcete-li zobrazit ukončení, musíte se skutečně zaregistrovat ve službě Windows a ověřit ho.
vydat
Abyste se mohli zaregistrovat ve službě systému Windows, musíte program publikovat. Klikněte pravým tlačítkem myši na projekt a zvolte Publikovat.
Vyberte Složky.
Umístění složky je ve výchozím nastavení příjemné.
Vytvoří se nastavení publikování, proto vyberte "Zobrazit všechna nastavení".
Nastavte jej následovně:
Název parametru Poznámky k hodnotě | ||
---|---|---|
konfigurace | Vydání (výchozí) | |
Cílová architektura | net8.0 (výchozí) | |
Režimy nasazení | Závislost architektury | Samostatně pro prostředí registrace služby. Pokud instalujete modul runtime NEt 8, je toto nastavení v pořádku. |
Cílový modul runtime | win-x64 | Pokud je operační systém 32bitové prostředí, vyberte win-x86 |
Cílová lokalita | výchozí | |
Vytvoření jednoho souboru | NA | |
Kompilace ReadyToRun | libovolný |
Po nastavení klikněte na tlačítko "Odeslat".
Pokud se v levém dolním rohu zobrazí zpráva "Publikování proběhlo úspěšně", je dokončeno.
Výstupní soubor lze otevřít kliknutím na "Cílové umístění".
Umístění do programu a zápis do služeb
Přihlaste se do prostředí, ve kterém chcete zaregistrovat službu Windows s oprávněními správce.
Zkopírujte publikovaný soubor do prostředí, ve kterém ho chcete zaregistrovat jako službu systému Windows. Můžete jej umístit do libovolné složky, ale mějte na paměti, že služba Windows bude vždy odkazovat na program v této složce.
Také pokud publikovaný soubor obsahuje soubor s příponou .pdb
, nekopírujte jej do prostředí, kde jej může vidět nespecifikovaná osoba, protože obsahuje informace o vývoji.
Jakmile je soubor na místě, zaregistrujte ho jako službu Windows. K registraci použijte příkaz. Klepněte pravým tlačítkem myši na nabídku Start a vyberte "Terminál (Admin)". Pan/paní běží v prostředí Windows 11, ale v jiných prostředích je v pořádku otevřít příkazový řádek s oprávněními správce.
V případě terminálu může být nejprve otevřen PowerShell, ale PowerShell jej nemusí být schopen správně nastavit, proto otevřete "Příkazový řádek".
Můžete jej zaregistrovat ve službě systému Windows pomocí následujícího příkazu:
formát
sc create "<サービス名>" start=auto binpath="<プログラム(.exe)のパス>"
Příklad vstupu
sc create "WindowsServiceDotNet8" start=auto binpath="C:\Service\WindowsServiceDotNet8\WindowsServiceDotNet8.exe"
<サービス名>
je název, který se zobrazí v seznamu služeb systému Windows. Můžete nastavit samostatný zobrazovaný název, ale pokud nezadáte zobrazovaný název, zobrazí se tento název.
Ovlivňuje také registr, takže jsou upřednostňovány alfanumerické názvy služeb.
start=auto
je nastavení, které automaticky spustí službu při spuštění systému Windows.
Pokud jej chcete spustit ručně, odstraňte tento popis.
binpath
je úplná cesta k programovým souborům.
Pokud příkaz spustíte a [SC] CreateService SUCCESS
zobrazí , je úspěšný.
Služby, které jste zaregistrovali, by se měly zobrazit v seznamu.
Spusťte službu a zkontrolujte její funkčnost
Pokud chcete službu spustit, můžete ji spustit ze servisní obrazovky nebo pomocí následujícího příkazu.
sc start <サービス名>
Příkaz stop je následující.
sc stop <サービス名>
Pokud službu zastavíte, můžete ověřit, zda je spuštěn proces vypínání.
Přidání popisu ke službě
Pole popisu přidané služby je prázdné, ale můžete ho přidat pomocí následujícího příkazu.
sc description <サービス名> "<説明文>"
Odstranění služby
Pokud chcete službu odstranit, můžete tak učinit pomocí následujícího příkazu. Na příkazovém řádku musíte mít oprávnění správce.
sc delete <サービス名>