Vytvoření služby pro Windows v .NET 8

Stránky aktualizovány :
Datum vytvoření stránky :

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 <サービス名>