"Windows" skirtos paslaugos kūrimas .NET 8
Darbo aplinka
- Vizualinė studija
-
- "Visual Studio 2022"
- .GRYNOJI
-
- .NET 8
- Windows
-
- Langai 11
Būtinosios sąlygos
- Vizualinė studija
-
- "Visual Studio 2022"
- .GRYNOJI
-
- .NET 8
- Windows
-
- Langai 10
- Langai 11
- "Windows" serveris
-
- "Windows 2012" arba naujesnė versija
Prielaida
- "Visual Studio" jau įdiegta
Iš pradžių
Kai bandau sukurti "Windows" paslaugą "Visual Studio .NET", yra tik ".NET Framework" šablonai. Jis taip pat gali būti sukurtas .NET (Core), o šablonas pavadintas "Worker Service".
Šiame straipsnyje paaiškinsiu, kaip tai naudoti norint sukurti, užregistruoti ir paleisti "Windows" paslaugą. Apdorojimo turinys yra minimalus, todėl, jei galite patvirtinti, kad jis veikia kaip "Windows" paslauga, sukurkite funkciją.
Projekto kūrimas
Paleiskite "Visual Studio". Pasirinkite Kurti naują projektą.
Įveskite aukščiau esantį ieškos サービス
lauką, tada sąraše pasirinkite Darbuotojo tarnyba.
"Windows Services" yra .NET Framework versija, kurioje nėra .NET versijos.
Projekto pavadinimas ir vieta gali būti savavališki. Tai neturi įtakos paslaugai, kuriai registruojatės.
「. Pasirinktas NET 8.0 ir palikite numatytuosius nustatymus, kad jį sukurtumėte.
Projektas buvo sukurtas.
Bibliotekų įtraukimas
Pradinėje būsenoje ji turi tik "paslaugų" funkciją ir jokių "Windows" specifinių funkcijų. Įtraukite biblioteką, kurią "Windows" paslauga gali naudoti iš "NuGet".
Dešiniuoju pelės mygtuku spustelėkite Priklausomybės ir pasirinkite Tvarkyti "NuGet" paketus.
Pasirinkite skirtuką Naršyti ir įveskite Microsoft.Extensions.Hosting.WindowsServices
paieškos laukelyje.
Jis bus rodomas sąraše, todėl įdiekite jį.
Spustelėkite Taikyti.
Jis buvo pridėtas kaip paketas.
Programų redagavimas
Šį kartą sukursiu paslaugą, kuri periodiškai prideda tekstą prie tekstinio failo kaip ponas /ponia.
Program.cs
Pridėkite "Windows" paslaugos funkcionalumą taip:
var builder = Host.CreateApplicationBuilder(args);
// ↓ここから追加
builder.Services.AddWindowsService();
// ↑ここまで追加
builder.Services.AddHostedService<Worker>();
var host = builder.Build();
host.Run();
Worker.cs
Galite savavališkai pakeisti klasės pavadinimą, tačiau šį kartą paliksime numatytąjį.
Pagal numatytuosius nustatymus yra tik metodai, kurie apdorojami ExecuteAsync
vykdant paslaugą, tačiau pakeiskime jį taip:
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);
}
}
}
Pridėjome naują metodą ir StopAsync
naują StartAsync
metodą.
Kaip rodo pavadinimas, šie metodai vadinami, kai paslauga paleidžiama ir kai ji sustabdoma.
Proceso turinys yra tiesiog aplankų kūrimas ir teksto rašymas, todėl praleisiu paaiškinimą.
ExecuteAsync
Metodas ir toliau kartojasi su "stoppingToken", kol while
jis bus pažymėtas atšaukti.
Įtraukite tai, ką while
norite apdoroti, kol paslauga veikia.
Tačiau, jei rašote tik procesą, kurį norite perkelti, paslauga veiks visu pajėgumu, todėl Task.Delay
pagrindinė yra ją perkelti laukiant tam tikro laiko su metodu.
Pagal numatytuosius nustatymus jis nustatytas į 1 sekundę (1000 ms), todėl bet kuriuo metu perrašykite.
Derinimo
Galite derinti iš "Visual Studio". Būkite tikri, kad iš tikrųjų nebūsite užsiregistravę tarnyboje.
Kai jį paleisite, pasirodys konsolė.
Jei procesas yra teisingas, galite matyti, kad failas buvo sukurtas.
Jei norite sustabdyti derinimą, uždarykite konsolę.
Jei patikrinsite žurnalą, pamatysite, kad paslaugos pradžios procesas praėjo, bet nutraukimo procesas ne. Norėdami pamatyti nutraukimą, turite iš tikrųjų užsiregistruoti "Windows" paslaugoje, kad ją patvirtintumėte.
išduoti
Kad galėtumėte užsiregistruoti "Windows" tarnyboje, turite paskelbti programą. Dešiniuoju pelės mygtuku spustelėkite projektą ir pasirinkite Publikuoti.
Pasirinkite Aplankai.
Pagal numatytuosius nustatymus aplanko vieta yra graži.
Bus sukurti publikavimo nustatymai, todėl pasirinkite "Rodyti visus nustatymus".
Nustatykite jį taip:
Parametro pavadinimas Reikšmė | Pastabos | |
---|---|---|
konfigūracija | Leidimas (numatytasis) | |
Tikslinė sistema | net8.0 (numatytasis) | |
Diegimo režimai | Sistemos priklausomybė | Atskirai paslaugų registravimo aplinkai. Jei diegiate NEt 8 vykdymo laiką, šis nustatymas yra gerai. |
Tikslinis vykdymo laikas | win-x64 | Jei OS yra 32 bitų aplinka, pasirinkite win-x86 |
Tikslinė vieta | Numatytasis | |
Vieno failo kūrimas | ANT | |
"ReadyToRun" kompiliavimas | Savavališkai |
Po nustatymo spustelėkite mygtuką "Pateikti".
Jei apatiniame kairiajame kampe rodoma "Leidyba buvo sėkminga", ji baigta.
Išvesties failą galima atidaryti spustelėjus "Tikslinė vieta".
Programos išdėstymas ir registracija į paslaugas
Prisijunkite prie aplinkos, kurioje norite užregistruoti "Windows" paslaugą su administratoriaus teisėmis.
Nukopijuokite publikuotą failą į aplinką, kurioje norite jį užregistruoti kaip "Windows" paslaugą. Galite įdėti jį į bet kurį aplanką, tačiau atminkite, kad "Windows" paslauga visada nurodys tame aplanke esančią programą.
Be to, jei paskelbtame faile yra failas su plėtiniu .pdb
, nekopijuokite jo aplinkoje, kur jį gali matyti nenurodytas asmuo, nes jame yra kūrimo informacijos.
Kai failas bus vietoje, užregistruokite jį kaip "Windows" paslaugą. Norėdami užsiregistruoti, naudokite komandą. Dešiniuoju pelės mygtuku spustelėkite meniu Pradėti ir pasirinkite "Terminalas (administratorius)". Mr./Ms. veikia "Windows 11" aplinkoje, tačiau kitose aplinkose gerai atidaryti komandų eilutę su administratoriaus teisėmis.
Terminalo atveju "PowerShell" gali būti atidaryta pirmiausia, tačiau "PowerShell" gali nepavykti jo tinkamai nustatyti, todėl atidarykite "Komandų eilutę".
Galite užregistruoti jį "Windows" paslaugoje naudodami šią komandą:
Formatas
sc create "<サービス名>" start=auto binpath="<プログラム(.exe)のパス>"
Įvesties pavyzdys
sc create "WindowsServiceDotNet8" start=auto binpath="C:\Service\WindowsServiceDotNet8\WindowsServiceDotNet8.exe"
<サービス名>
yra pavadinimas, rodomas "Windows" paslaugų sąraše. Galite nustatyti atskirą rodomą pavadinimą, bet jei nenurodysite rodomo pavadinimo, šis pavadinimas bus rodomas.
Tai taip pat turi įtakos registrui, todėl pirmenybė teikiama raidiniams ir skaitmeniniams paslaugų pavadinimams.
start=auto
yra nustatymas automatiškai paleisti paslaugą, kai paleidžiama "Windows".
Jei norite jį paleisti rankiniu būdu, ištrinkite šį aprašymą.
binpath
yra visas programos failų kelias.
Jei vykdysite komandą ir [SC] CreateService SUCCESS
rodysite , tai pavyks.
Jūsų užregistruotos paslaugos turėtų būti rodomos sąraše.
Paleiskite paslaugą ir patikrinkite jos veikimą
Jei norite paleisti paslaugą, galite ją paleisti iš aptarnavimo ekrano arba naudodami šią komandą.
sc start <サービス名>
Sustabdymo komanda yra tokia.
sc stop <サービス名>
Jei sustabdysite paslaugą, galėsite patikrinti, ar veikia išjungimo procesas.
Aprašo įtraukimas į paslaugą
Pridėtos paslaugos aprašo laukas yra tuščias, bet galite jį pridėti naudodami šią komandą.
sc description <サービス名> "<説明文>"
Paslaugos naikinimas
Jei norite ištrinti paslaugą, galite tai padaryti naudodami šią komandą. Komandinėje eilutėje turite turėti administratoriaus teises.
sc delete <サービス名>