Windows-palvelun luominen .NET 8:ssa
Toimintaympäristö
- Visuaalinen studio
-
- Visuaalinen studio 2022
- .VERKKO
-
- .NET 8
- Windows
-
- Windows 11
Edellytykset
- Visuaalinen studio
-
- Visuaalinen studio 2022
- .VERKKO
-
- .NET 8
- Windows
-
- Windows 10
- Windows 11
- Windows Server
-
- Windows 2012 tai uudempi
edellytys
- Visual Studio on jo asennettu
Alun perin
Kun yritän luoda Windows-palvelun Visual Studio .NET:ssä, siellä on vain .NET Framework -malleja. Se voidaan luoda myös .NET: ssä (Core), ja mallin nimi on "Worker Service".
Tässä artikkelissa selitän, kuinka tätä käytetään Windows-palvelun luomiseen, rekisteröintiin ja suorittamiseen. Käsittelysisältö on minimaalinen, joten jos voit vahvistaa, että se toimii Windows-palveluna, luo toiminto.
Luo projekti
Käynnistä Visual Studio. Valitse Luo uusi projekti.
Kirjoita yllä olevaan hakukenttään サービス
ja valitse sitten luettelosta Työntekijän palvelu.
"Windows-palvelut" on .NET Framework -versio, jolla ei ole .NET-versiota.
Projektin nimi ja sijainti voivat olla mielivaltaisia. Se ei vaikuta palveluun, johon olet rekisteröitymässä.
「. NET 8.0 on valittuna ja jätä oletusasetukset sen luomista varten.
Projekti on luotu.
Kirjastojen lisääminen
Alkutilassa sillä on vain "palvelu" -toiminto eikä Windows-kohtaisia toimintoja. Lisää kirjasto, jota Windows-palvelu voi käyttää NuGetista.
Napsauta hiiren kakkospainikkeella Riippuvuudet ja valitse NuGet-pakettien hallinta.
Valitse Selaa-välilehti ja kirjoita hakukenttään Microsoft.Extensions.Hosting.WindowsServices
.
Se näkyy luettelossa, joten asenna se.
Klikkaa Käytä.
Se lisättiin pakettina.
Ohjelmien muokkaaminen
Tällä kertaa luon palvelun, joka lisää ajoittain tekstiä tekstitiedostoon Mr./Ms.:nä.
Program.cs
Lisää Windows-palvelun toiminnot seuraavasti:
var builder = Host.CreateApplicationBuilder(args);
// ↓ここから追加
builder.Services.AddWindowsService();
// ↑ここまで追加
builder.Services.AddHostedService<Worker>();
var host = builder.Build();
host.Run();
Worker.cs
Voit muuttaa luokan nimeä mielivaltaisesti, mutta tällä kertaa jätämme oletusarvon.
Oletusarvoisesti on vain menetelmiä, joita ExecuteAsync
käsitellään, kun palvelu suoritetaan, mutta muutetaan sitä seuraavasti:
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);
}
}
}
Olemme lisänneet uuden menetelmän ja StopAsync
uuden StartAsync
menetelmän.
Kuten nimestä käy ilmi, näitä menetelmiä kutsutaan, kun palvelu käynnistetään ja kun se pysäytetään.
Prosessin sisältö on yksinkertaisesti kansioiden luominen ja tekstin kirjoittaminen, joten jätän selityksen pois.
ExecuteAsync
Menetelmä jatkaa silmukkaa stoppingTokenin kanssa, kunnes while
se merkitään peruutettavaksi.
Lisää, mitä while
haluat käsiteltävän, kun palvelu on käynnissä.
Jos kuitenkin kirjoitat vain prosessin, jonka haluat siirtää, palvelu toimii täydellä kapasiteetilla, joten Task.Delay
on perustärkeää siirtää sitä odottaessasi tiettyä aikaa menetelmällä.
Oletuksena se on asetettu 1 sekuntiin (1000 ms), joten kirjoita se uudelleen milloin tahansa.
debugata
Voit tehdä virheenkorjauksen Visual Studiosta. Voit olla varma, että et itse asiassa rekisteröidy palveluun.
Kun suoritat sen, konsoli tulee näkyviin.
Jos prosessi on oikea, näet, että tiedosto on luotu.
Jos haluat lopettaa virheenkorjauksen, sulje konsoli.
Jos tarkistat lokin, näet, että palvelun käynnistysprosessi on kulunut, mutta lopetusprosessi ei. Jos haluat nähdä irtisanomisen, sinun on rekisteröidyttävä Windows-palveluun vahvistaaksesi sen.
ongelma
Jotta voit rekisteröityä Windows-palveluun, sinun on julkaistava ohjelma. Napsauta projektia hiiren kakkospainikkeella ja valitse Julkaise.
Valitse Kansiot.
Kansion sijainti on oletusarvoisesti mukava.
Julkaisuasetukset luodaan, joten valitse "Näytä kaikki asetukset".
Määritä se seuraavasti:
Parametrin nimen arvo | Huomautuksia | |
---|---|---|
konfiguraatio | Release (oletus) | |
Kohde-kehys | Net8.0 (oletus) | |
Käyttöönottotavat | Riippuvuus kehyksestä | Erikseen palvelun rekisteröintiympäristölle. Jos asennat NEt 8 runtimea, tämä asetus on OK. |
Ajonaikatavoite | Win-X64 | Jos käyttöjärjestelmä on 32-bittinen ympäristö, valitse win-x86 |
Kohteen sijainti | laiminlyönti | |
Yhden tiedoston luominen | PÄÄLLE | |
ReadyToRun-kokoelma | mielivaltainen |
Asetuksen tekemisen jälkeen napsauta "Lähetä" -painiketta.
Jos vasemmassa alakulmassa näkyy "Julkaiseminen onnistui", se on valmis.
Tulostetiedosto voidaan avata napsauttamalla "Kohdesijainti".
Ohjelman sijoittaminen ja palveluihin ilmoittautuminen
Kirjaudu ympäristöön, johon haluat rekisteröidä Windows-palvelun järjestelmänvalvojan oikeuksilla.
Kopioi julkaistu tiedosto ympäristöön, johon haluat rekisteröidä sen Windows-palveluna. Voit sijoittaa sen mihin tahansa kansioon, mutta muista, että Windows-palvelu viittaa aina kyseisessä kansiossa olevaan ohjelmaan.
Lisäksi, jos julkaistu tiedosto sisältää tiedoston, jonka tunniste .pdb
on , älä kopioi sitä ympäristössä, jossa määrittelemätön henkilö voi nähdä sen, koska se sisältää kehitystietoja.
Kun tiedosto on paikallaan, rekisteröi se Windows-palveluna. Käytä komentoa rekisteröityäksesi. Napsauta hiiren kakkospainikkeella Käynnistä-valikkoa ja valitse "Terminal (Admin)". Mr./Ms. toimii Windows 11 -ympäristössä, mutta muissa ympäristöissä on OK avata komentokehote järjestelmänvalvojan oikeuksilla.
Päätelaitteen tapauksessa PowerShell voi olla ensin auki, mutta PowerShell ei ehkä pysty määrittämään sitä oikein, joten avaa komentokehote.
Voit rekisteröidä sen Windows-palveluun seuraavalla komennolla:
formaatti
sc create "<サービス名>" start=auto binpath="<プログラム(.exe)のパス>"
Esimerkki syötteestä
sc create "WindowsServiceDotNet8" start=auto binpath="C:\Service\WindowsServiceDotNet8\WindowsServiceDotNet8.exe"
<サービス名>
on nimi, joka näkyy Windows-palveluiden luettelossa. Voit määrittää erillisen näyttönimen, mutta jos et määritä näyttönimeä, tämä nimi näytetään.
Se vaikuttaa myös rekisteriin, joten aakkosnumeeriset palvelunimet ovat suositeltavia.
start=auto
on asetus, joka käynnistää palvelun automaattisesti, kun Windows käynnistyy.
Jos haluat käynnistää sen manuaalisesti, poista tämä kuvaus.
binpath
on ohjelmatiedostojen koko polku.
Jos suoritat komennon ja [SC] CreateService SUCCESS
näytät , se onnistuu.
Rekisteröimiesi palveluiden pitäisi näkyä luettelossa.
Käynnistä palvelu ja tarkista sen toiminta
Jos haluat suorittaa palvelun, voit käynnistää sen palvelunäytöstä tai seuraavalla komennolla.
sc start <サービス名>
Pysäytyskomento on seuraava.
sc stop <サービス名>
Jos pysäytät palvelun, voit varmistaa, että sammutusprosessi on käynnissä.
Lisää palveluun kuvaus
Lisätyn palvelun kuvauskenttä on tyhjä, mutta voit lisätä sen seuraavalla komennolla.
sc description <サービス名> "<説明文>"
Palvelun poistaminen
Jos haluat poistaa palvelun, voit tehdä sen seuraavalla komennolla. Sinulla on oltava järjestelmänvalvojan oikeudet komentokehotteessa.
sc delete <サービス名>