Windows-szolgáltatás létrehozása a .NET 8-ban
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 <サービス名>