Pakalpojuma izveide operētājsistēmai Windows operētājsistēmā .NET 8
Darbības vide
- Visual Studio
-
- Visual Studio 2022
- .NETO
-
- .NET 8
- Windows
-
- Operētājsistēmā Windows 11
Priekšnoteikumi
- Visual Studio
-
- Visual Studio 2022
- .NETO
-
- .NET 8
- Windows
-
- Operētājsistēmā Windows 10
- Operētājsistēmā Windows 11
- Windows Server
-
- Windows 2012 vai jaunāka versija
Priekšnosacījumu
- Visual Studio jau ir instalēta
Sākumā
Mēģinot izveidot Windows pakalpojumu programmā Visual Studio .NET, ir tikai .NET Framework veidnes. To var izveidot arī .NET (Core), un veidnes nosaukums ir "Worker Service".
Šajā rakstā es paskaidrošu, kā to izmantot, lai izveidotu, reģistrētu un palaistu Windows pakalpojumu. Apstrādes saturs ir minimāls, tādēļ, ja varat apstiprināt, ka tas darbojas kā Windows pakalpojums, lūdzu, izveidojiet šo funkciju.
Izveidojiet projektu
Startējiet programmu Visual Studio. Atlasiet Izveidot jaunu projektu.
Ievadiet iepriekš redzamajā サービス
meklēšanas laukā un pēc tam sarakstā atlasiet Darbinieku apkalpošana.
"Windows pakalpojumi" ir .NET Framework versija, kurai nav .NET versijas.
Projekta nosaukums un atrašanās vieta var būt patvaļīga. Tas neietekmē pakalpojumu, kuram reģistrējaties.
「. Ir atlasīts NET 8.0 un atstājiet noklusējumus, lai to izveidotu.
Projekts ir izveidots.
Bibliotēku pievienošana
Sākotnējā stāvoklī tam ir tikai "pakalpojuma" funkcija un nav Windows specifisku funkciju. Pievienojiet bibliotēku, ko var izmantot Windows pakalpojums no NuGet.
Ar peles labo pogu noklikšķiniet uz Atkarības un atlasiet Pārvaldīt NuGet pakotnes.
Atlasiet cilni Pārlūkot un ievadiet Microsoft.Extensions.Hosting.WindowsServices
meklēšanas laukā.
Tas parādīsies sarakstā, tāpēc instalējiet to.
Noklikšķiniet uz Lietot.
Tas tika pievienots kā pakete.
Programmu rediģēšana
Šoreiz es izveidošu pakalpojumu, kas periodiski pievieno tekstu teksta failam kā Mr./Ms..
Program.cs
Pievienojiet Windows pakalpojuma funkcionalitāti šādi:
var builder = Host.CreateApplicationBuilder(args);
// ↓ここから追加
builder.Services.AddWindowsService();
// ↑ここまで追加
builder.Services.AddHostedService<Worker>();
var host = builder.Build();
host.Run();
Worker.cs
Jūs varat patvaļīgi mainīt klases nosaukumu, bet šoreiz mēs atstāsim noklusējumu.
Pēc noklusējuma ir tikai metodes, kas tiek ExecuteAsync
apstrādātas, kad pakalpojums tiek izpildīts, bet mainīsim to šādi:
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);
}
}
}
Mēs esam pievienojuši jaunu metodi un StopAsync
jaunu StartAsync
metodi.
Kā norāda nosaukums, šīs metodes tiek sauktas, kad pakalpojums tiek uzsākts un kad tas tiek pārtraukts.
Procesa saturs ir vienkārši mapju izveide un teksta rakstīšana, tāpēc es izlaidīšu skaidrojumu.
ExecuteAsync
Metode turpina cilpu ar stopToken, līdz while
tā tiek atzīmēta atcelšanai.
Pievienojiet to, ko while
vēlaties apstrādāt pakalpojuma darbības laikā.
Tomēr, ja rakstāt tikai procesu, kuru vēlaties pārvietot, pakalpojums darbosies ar pilnu jaudu, tāpēc Task.Delay
ir pamata to pārvietot, gaidot noteiktu laiku ar šo metodi.
Pēc noklusējuma tas ir iestatīts uz 1 sekundi (1000ms), tāpēc, lūdzu, pārrakstiet to jebkurā laikā.
Atkļūdošanas
Jūs varat atkļūdot no Visual Studio. Varat būt drošs, ka jūs faktiski netiksiet reģistrēts pakalpojumā.
Palaižot to, parādīsies konsole.
Ja process ir pareizs, varat redzēt, ka fails ir izveidots.
Ja vēlaties pārtraukt atkļūdošanu, aizveriet konsoli.
Pārbaudot žurnālu, jūs varat redzēt, ka pakalpojuma sākšanas process ir pagājis, bet pārtraukšanas process nav pagājis. Lai redzētu izbeigšanu, jums faktiski jāreģistrējas Windows pakalpojumā, lai to pārbaudītu.
jautājums
Lai varētu reģistrēties Windows pakalpojumā, jums ir jāpublicē programma. Ar peles labo pogu noklikšķiniet uz projekta un izvēlieties Publicēt.
Atlasiet Mapes.
Mapes atrašanās vieta pēc noklusējuma ir jauka.
Tiks izveidoti publicēšanas iestatījumi, tāpēc atlasiet "Rādīt visus iestatījumus".
Iestatiet to šādi:
Parametra nosaukums Vērtības | piezīmes | |
---|---|---|
Konfigurācijas | Laidiens (noklusējums) | |
Mērķa sistēma | net8.0 (noklusējums) | |
Izvietošanas režīmi | Atkarība no sistēmas | Atsevišķi pakalpojumu reģistrācijas videi. Ja instalējat NEt 8 izpildlaiku, šis iestatījums ir labi. |
Mērķa izpildlaiks | WIN-x64 | Ja OS ir 32 bitu vide, atlasiet win-x86 |
Mērķa atrašanās vieta | Noklusējuma | |
Viena faila izveide | IESLĒGTS | |
ReadyToRun kompilācija | Patvaļīgu |
Pēc iestatīšanas noklikšķiniet uz pogas "Iesniegt".
Ja apakšējā kreisajā stūrī tiek parādīts "Publicēšana bija veiksmīga", tas ir pabeigts.
Izvades failu var atvērt, noklikšķinot uz "Mērķa atrašanās vieta".
Programmu izvietošana un reģistrācija pakalpojumos
Piesakieties vidē, kurā vēlaties reģistrēt Windows pakalpojumu ar administratora tiesībām.
Kopējiet publicēto failu vidē, kurā vēlaties to reģistrēt kā Windows pakalpojumu. To var ievietot jebkurā mapē, taču ņemiet vērā, ka Windows pakalpojums vienmēr atsauksies uz programmu šajā mapē.
Arī tad, ja publicētajā failā ir fails ar paplašinājumu .pdb
, nekopējiet to vidē, kur to var redzēt nenoteikta persona, jo tajā ir informācija par attīstību.
Kad fails ir ievietots, reģistrējiet to kā Windows pakalpojumu. Izmantojiet komandu, lai reģistrētos. Ar peles labo pogu noklikšķiniet uz izvēlnes Sākt un atlasiet "Terminal (Admin)". Mr./Ms. darbojas Windows 11 vidē, bet citās vidēs ir pareizi atvērt komandu uzvedni ar administratora privilēģijām.
Termināļa gadījumā PowerShell var būt atvērts vispirms, bet PowerShell, iespējams, nevarēs to pareizi iestatīt, tāpēc atveriet "Komandu uzvedni".
To var reģistrēt Windows pakalpojumā ar šādu komandu:
Formātā
sc create "<サービス名>" start=auto binpath="<プログラム(.exe)のパス>"
Ievades piemērs
sc create "WindowsServiceDotNet8" start=auto binpath="C:\Service\WindowsServiceDotNet8\WindowsServiceDotNet8.exe"
<サービス名>
ir nosaukums, kas tiek parādīts Windows pakalpojumu sarakstā. Varat iestatīt atsevišķu parādāmo vārdu, bet, ja nenorādīsit parādāmo vārdu, šis vārds tiks parādīts.
Tas ietekmē arī reģistru, tāpēc priekšroka tiek dota burtciparu pakalpojumu nosaukumiem.
start=auto
ir iestatījums, lai automātiski startētu pakalpojumu, startējot sistēmu Windows.
Ja vēlaties to sākt manuāli, izdzēsiet šo aprakstu.
binpath
ir pilns programmas failu ceļš.
Ja izpildāt komandu un [SC] CreateService SUCCESS
parādāt , tas ir veiksmīgs.
Jūsu reģistrētajiem pakalpojumiem ir jābūt redzamiem sarakstā.
Sāciet pakalpojumu un pārbaudiet tā darbību
Ja vēlaties palaist pakalpojumu, varat to startēt no servisa ekrāna vai ar šādu komandu.
sc start <サービス名>
Apturēšanas komanda ir šāda.
sc stop <サービス名>
Ja pārtraucat pakalpojuma sniegšanu, varat pārbaudīt, vai izslēgšanas process darbojas.
Apraksta pievienošana pakalpojumam
Pievienotā pakalpojuma apraksta lauks ir tukšs, bet to var pievienot ar šādu komandu.
sc description <サービス名> "<説明文>"
Pakalpojuma dzēšana
Ja vēlaties dzēst pakalpojumu, varat to izdarīt ar šādu komandu. Komandu uzvednē ir jābūt administratora tiesībām.
sc delete <サービス名>