Looge Windowsi jaoks teenus .NET 8-s
Töökeskkond
- Visuaalne stuudio
-
- Visual Studio 2022
- .NET
-
- .NET 8
- Windows
-
- Windows 11
Eeltingimused
- Visuaalne stuudio
-
- Visual Studio 2022
- .NET
-
- .NET 8
- Windows
-
- Windows 10
- Windows 11
- Windows Server
-
- Windows 2012 või uuem
eeltingimus
- Visual Studio on juba installitud
Alguses
Kui proovin luua Windowsi teenust Visual Studio .NET-is, on ainult .NET Frameworki mallid. Seda saab luua ka .NET (Core) ja malli nimi on "Worker Service".
Selles artiklis selgitan, kuidas seda kasutada Windowsi teenuse loomiseks, registreerimiseks ja käitamiseks. Töötlemissisu on minimaalne, nii et kui saate kinnitada, et see töötab Windowsi teenusena, looge see funktsioon.
Projekti loomine
Käivitage Visual Studio. Valige Loo uus projekt.
Sisestage ülaltoodud otsinguväljale サービス
ja seejärel valige loendist Töötaja teenus.
"Windowsi teenused" on .NET Frameworki versioon, millel ei ole .NET versiooni.
Projekti nimi ja asukoht võivad olla suvalised. See ei mõjuta teenust, mille kasutajaks registreerute.
「. NET 8.0 on valitud ja jätke vaikeväärtused selle loomiseks.
Projekt on loodud.
Teekide lisamine
Esialgses olekus on sellel ainult "teenuse" funktsioon ja puuduvad Windowsi spetsiifilised funktsioonid. Lisage teek, mida saab kasutada NuGeti Windowsi teenuses.
Paremklõpsake sõltuvusi ja valige NuGeti pakettide haldamine.
Valige vahekaart Sirvi ja sisestage otsinguväljale Microsoft.Extensions.Hosting.WindowsServices
.
See ilmub loendisse, nii et installige see.
Klõpsake nuppu Apply (Rakenda).
See lisati paketina.
Programmide redigeerimine
Seekord loon teenuse, mis lisab perioodiliselt teksti tekstifailile hr/pr.
Program.cs
Lisage Windowsi teenuse funktsionaalsus järgmiselt:
var builder = Host.CreateApplicationBuilder(args);
// ↓ここから追加
builder.Services.AddWindowsService();
// ↑ここまで追加
builder.Services.AddHostedService<Worker>();
var host = builder.Build();
host.Run();
Worker.cs
Klassi nime saate meelevaldselt muuta, kuid seekord jätame vaikimisi.
Vaikimisi on teenuse täitmisel ainult meetodeid, mida ExecuteAsync
töödeldakse, kuid muudame seda järgmiselt:
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);
}
}
}
Lisasime uue meetodi ja StopAsync
uue StartAsync
meetodi.
Nagu nimigi ütleb, kutsutakse neid meetodeid teenuse käivitamisel ja selle peatamisel.
Protsessi sisu on lihtsalt kaustade loomine ja teksti kirjutamine, nii et ma jätan selgituse välja.
ExecuteAsync
Meetod jätkab stopingTokeniga silmust, kuni while
see on tühistamiseks lipuga märgitud.
Lisage, mida while
soovite teenuse töötamise ajal töödelda.
Kui aga kirjutate ainult protsessi, mida soovite teisaldada, töötab teenus täisvõimsusel, seega Task.Delay
on põhiline seda meetodiga teatud aega oodates teisaldada.
Vaikimisi on selle väärtuseks seatud 1 sekund (1000 ms), nii et palun kirjutage see igal ajal ümber.
Debug
Saate siluda Visual Studiost. Võite olla kindel, et teid ei registreerita tegelikult teenuses.
Selle käivitamisel ilmub konsool.
Kui protsess on õige, näete, et fail on loodud.
Kui soovite silumise lõpetada, sulgege konsool.
Kui kontrollite logi, näete, et teenuse käivitamise protsess on möödas, kuid lõpetamisprotsess pole seda teinud. Lõpetamise nägemiseks peate selle kontrollimiseks tegelikult Windowsi teenuses registreeruma.
Küsimus
Windowsi teenuses registreerumiseks peate programmi avaldama. Paremklõpsake projekti ja valige käsk Avalda.
Valige Kaustad.
Kausta asukoht on vaikimisi kena.
Luuakse avaldamisseaded, seega valige "Näita kõiki seadeid".
Seadistage see järgmiselt.
Parameetri nimi Väärtus | Märkused | |
---|---|---|
Konfiguratsiooni | Vabastamine (vaikimisi) | |
Sihtraamistik | net8.0 (vaikimisi) | |
Juurutusrežiimid | Raamistiku sõltuvus | Teenuse registreerimise keskkonna jaoks eraldi. Kui installite NEt 8 käitusaega, on see säte OK. |
Käitusaja eesmärk | Win-X64 | Kui operatsioonisüsteem on 32-bitine keskkond, valige win-x86 |
Sihtkoha asukoht | Vaikimisi | |
Ühe faili loomine | SEES | |
ReadyToRun kompileerimine | Meelevaldne |
Pärast seadistamist klõpsake nuppu "Esita".
Kui vasakus alanurgas kuvatakse teade "Kirjastamine õnnestus", on see lõpetatud.
Väljundfaili saab avada, klõpsates "Target Location".
Programmi paigutamine ja teenustesse registreerimine
Logige sisse keskkonda, kus soovite Windowsi teenuse administraatori õigustega registreerida.
Kopeerige avaldatud fail keskkonda, kus soovite selle Windowsi teenusena registreerida. Võite selle paigutada mis tahes kausta, kuid pidage meeles, et Windowsi teenus viitab alati selles kaustas olevale programmile.
Samuti, kui avaldatud fail sisaldab laiendiga .pdb
faili , ärge kopeerige seda keskkonda, kus seda näeb määratlemata isik, kuna see sisaldab arendusteavet.
Kui fail on paigas, registreerige see Windowsi teenusena. Registreerimiseks kasutage käsku. Paremklõpsake menüüd Start ja valige "Terminal (Admin)". Mr./Ms. töötab Windows 11 keskkonnas, kuid teistes keskkondades on administraatori õigustega käsurea avamine OK.
Terminali puhul võib PowerShell olla kõigepealt avatud, kuid PowerShell ei pruugi seda õigesti seadistada, nii et avage "Command Prompt".
Saate selle Windowsi teenuses registreerida järgmise käsuga:
Formaat
sc create "<サービス名>" start=auto binpath="<プログラム(.exe)のパス>"
Sisendi näide
sc create "WindowsServiceDotNet8" start=auto binpath="C:\Service\WindowsServiceDotNet8\WindowsServiceDotNet8.exe"
<サービス名>
on nimi, mis kuvatakse Windowsi teenuste loendis. Saate määrata eraldi kuvatava nime, kuid kui te kuvatavat nime ei määra, kuvatakse see nimi.
See mõjutab ka registrit, seega eelistatakse tähtnumbrilisi teenusenimesid.
start=auto
on säte teenuse automaatseks käivitamiseks Windowsi käivitamisel.
Kui soovite selle käsitsi käivitada, kustutage see kirjeldus.
binpath
on programmifailide täielik tee.
Kui täidate käsku ja [SC] CreateService SUCCESS
kuvate , on see edukas.
Teie registreeritud teenused peaksid olema loendis.
Käivitage teenus ja kontrollige selle toimimist
Kui soovite teenust käivitada, saate selle käivitada teenuse ekraanilt või järgmise käsuga.
sc start <サービス名>
Stoppkäsklus on järgmine.
sc stop <サービス名>
Kui peatate teenuse, saate kontrollida, kas sulgemisprotsess töötab.
Teenusele kirjelduse lisamine
Lisatud teenuse kirjelduse väli on tühi, kuid saate selle lisada järgmise käsuga.
sc description <サービス名> "<説明文>"
Teenuse kustutamine
Kui soovite teenuse kustutada, saate seda teha järgmise käsuga. Teil peavad käsureal olema administraatori õigused.
sc delete <サービス名>