Windows-szolgáltatás létrehozása a .NET 8-ban

Oldal frissítve :
Oldal létrehozásának dátuma :

Működési környezet

Visual Studio
  • Visual Studio 2022
.HÁLÓ
  • .NET 8
Windows
  • Windows 11 esetén

Előfeltételek

Visual Studio
  • Visual Studio 2022
.HÁLÓ
  • .NET 8
Windows
  • Windows 10 esetén
  • Windows 11 esetén
Windows Server
  • Windows 2012 vagy újabb

előfeltétel

  • A Visual Studio már telepítve van

Először

Amikor Windows-szolgáltatást próbálok létrehozni a Visual Studio .NET alkalmazásban, csak .NET-keretrendszer sablonjai vannak. NET-ben (Core) is létrehozható, és a sablon neve "Worker Service".

Ebben a cikkben elmagyarázom, hogyan lehet ezt használni egy Windows-szolgáltatás létrehozásához, regisztrálásához és futtatásához. A feldolgozási tartalom minimális, ezért ha meg tudja erősíteni, hogy Windows-szolgáltatásként fut, hozza létre a függvényt.

Projekt létrehozása

Indítsa el a Visual Studiót. Válassza az Új projekt létrehozása lehetőséget.

Írja be a サービス fenti keresőmezőbe, majd válassza a Worker Service lehetőséget a listából. A "Windows-szolgáltatások" a .NET-keretrendszer verziója, amelynek nincs .NET-verziója.

A projekt neve és helye tetszőleges lehet. Ez nem befolyásolja azt a szolgáltatást, amelyre regisztrál.

「. NET 8.0 van kiválasztva, és hagyja meg az alapértelmezett értékeket a létrehozásához.

A projekt létrejött.

Könyvtárak hozzáadása

A kezdeti állapotban csak egy "szolgáltatás" funkcióval rendelkezik, és nincs Windows-specifikus funkciója. Adjon hozzá egy kódtárat, amelyet egy Windows-szolgáltatás használhat a NuGetből.

Kattintson a jobb gombbal a Függőségek elemre, és válassza a Manage NuGet Packages (NuGet-csomagok kezelése) lehetőséget.

Válassza a Tallózás lapot, és írja be a Microsoft.Extensions.Hosting.WindowsServices keresőmezőbe. Ez megjelenik a listában, ezért telepítse.

Kattintson az Apply (Alkalmaz) gombra.

Csomagként lett hozzáadva.

Programok szerkesztése

Ezúttal létrehozok egy szolgáltatást, amely rendszeresen szöveget ad hozzá egy szövegfájlhoz Mr. / Ms. néven.

Program.cs

Adja hozzá a Windows-szolgáltatás funkcióit az alábbiak szerint:

var builder = Host.CreateApplicationBuilder(args);
// ↓ここから追加
builder.Services.AddWindowsService();
// ↑ここまで追加
builder.Services.AddHostedService<Worker>();

var host = builder.Build();
host.Run();

Worker.cs

Az osztály nevét önkényesen megváltoztathatja, de ezúttal az alapértelmezettet hagyjuk.

Alapértelmezés szerint csak a szolgáltatás végrehajtásakor vannak olyan metódusok, amelyek ExecuteAsync feldolgozásra kerülnek, de módosítsuk a következőképpen:

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);
    }
  }
}

Hozzáadtunk egy új metódust és StopAsync egy új StartAsync metódust. Ahogy a neve is mutatja, ezeket a metódusokat a szolgáltatás indításakor és leállításakor hívják meg. A folyamat tartalma egyszerűen mappák létrehozása és szöveg írása, ezért elhagyom a magyarázatot.

ExecuteAsync A metódus továbbra is hurkolódik a stoppingToken használatával, amíg meg nem while jelöli törlésre. Adja hozzá a while szolgáltatás futása közben feldolgozni kívánt adatokat. Ha azonban csak az áthelyezni kívánt folyamatot írja, a szolgáltatás teljes kapacitással fog futni, ezért Task.Delay alapvető fontosságú, hogy egy bizonyos ideig várakozzon a metódussal. Alapértelmezés szerint 1 másodpercre (1000 ms) van beállítva, ezért kérjük, bármikor írja át.

Debug

A hibakeresést a Visual Studióból végezheti el. Biztos lehet benne, hogy valójában nem regisztrál a szolgáltatásra.

Futtatásakor megjelenik a konzol.

Ha a folyamat helyes, láthatja, hogy a fájl létrejött.

Ha le szeretné állítani a hibakeresést, zárja be a konzolt.

Ha ellenőrzi a naplót, láthatja, hogy a szolgáltatás indítási folyamata elhaladt, de a leállítási folyamat nem. A megszüntetés megtekintéséhez ténylegesen regisztrálnia kell a Windows-szolgáltatásban annak ellenőrzéséhez.

kiad

Ahhoz, hogy regisztrálhasson egy Windows-szolgáltatásba, közzé kell tennie a programot. Kattintson a jobb gombbal a projektre, és válassza a Közzététel parancsot.

Válassza a Mappák lehetőséget.

A mappa helye alapértelmezés szerint szép.

Létrejönnek a közzétételi beállítások, ezért válassza az "Összes beállítás megjelenítése" lehetőséget.

Állítsa be a következőképpen:

Paraméter neve Érték Megjegyzések
konfiguráció Kiadás (alapértelmezett)
Cél-keretrendszer Net8.0 (alapértelmezett)
Telepítési módok Keretrendszer-függőség Külön a szolgáltatásregisztrációs környezethez. Ha a NEt 8 futtatókörnyezetet telepíti, ez a beállítás rendben van.
Cél futtatókörnyezet win-x64 Ha az operációs rendszer 32 bites környezet, válassza a win-x86 lehetőséget
Cél helye alapértelmezett
Egyetlen fájl létrehozása RA
ReadyToRun összeállítás tetszőleges

A beállítás után kattintson a "Küldés" gombra.

Ha a bal alsó sarokban a "Közzététel sikeres volt" üzenet jelenik meg, akkor kész.

A kimeneti fájl a "Célhely" gombra kattintva nyitható meg.

Programelhelyezés és beiratkozás a szolgáltatásokba

Jelentkezzen be abba a környezetbe, ahol rendszergazdai jogosultságokkal szeretné regisztrálni a Windows-szolgáltatást.

Másolja a közzétett fájlt abba a környezetbe, ahol Windows-szolgáltatásként szeretné regisztrálni. Bármely mappába elhelyezheti, de ne feledje, hogy a Windows-szolgáltatás mindig az adott mappában található programra hivatkozik.

Továbbá, ha a közzétett fájl kiterjesztésű .pdb fájlt tartalmaz, ne másolja olyan környezetbe, ahol meghatározatlan személy láthatja, mert fejlesztési információkat tartalmaz.

Ha a fájl a helyén van, regisztrálja Windows-szolgáltatásként. A regisztrációhoz használja a parancsot. Kattintson a jobb gombbal a Start menüre, és válassza a "Terminál (Admin)" lehetőséget. Mr./Ms. Windows 11 környezetben fut, de más környezetekben rendben van a parancssor megnyitása rendszergazdai jogosultságokkal.

A terminál esetében előfordulhat, hogy a PowerShell először nyitva van, de előfordulhat, hogy a PowerShell nem tudja megfelelően beállítani, ezért nyissa meg a "Parancssort".

A következő paranccsal regisztrálhatja azt a Windows szolgáltatásban:

formátum

sc create "<サービス名>" start=auto binpath="<プログラム(.exe)のパス>"

Példa bemenetre

sc create "WindowsServiceDotNet8" start=auto binpath="C:\Service\WindowsServiceDotNet8\WindowsServiceDotNet8.exe"

<サービス名> a Windows-szolgáltatások listájában megjelenő név. Beállíthat külön megjelenítendő nevet, de ha nem ad meg megjelenítendő nevet, ez a név jelenik meg. Ez a beállításjegyzékre is hatással van, ezért az alfanumerikus szolgáltatásneveket részesíti előnyben.

start=auto egy olyan beállítás, amely automatikusan elindítja a szolgáltatást a Windows indításakor. Ha manuálisan szeretné elindítani, törölje ezt a leírást.

binpath a programfájlok teljes elérési útja.

Ha végrehajtja a parancsot, és [SC] CreateService SUCCESS megjeleníti a parancsot, akkor sikeres.

A regisztrált szolgáltatásoknak meg kell jelenniük a listában.

Indítsa el a szolgáltatást, és ellenőrizze annak működését

Ha futtatni szeretné a szolgáltatást, elindíthatja azt a szolgáltatás képernyőjéről vagy a következő paranccsal.

sc start <サービス名>

A stop parancs a következő.

sc stop <サービス名>

Ha leállítja a szolgáltatást, ellenőrizheti, hogy fut-e a leállítási folyamat.

Leírás hozzáadása a szolgáltatáshoz

A hozzáadott szolgáltatás leírás mezője üres, de a következő paranccsal hozzáadhatja.

sc description <サービス名> "<説明文>"

Szolgáltatás törlése

Ha törölni szeretné a szolgáltatást, ezt a következő paranccsal teheti meg. Rendszergazdai jogosultságokkal kell rendelkeznie a parancssorban.

sc delete <サービス名>