Crear un servei per al Windows a .NET 8
Entorn operatiu
- Visual Studio
-
- Visual Studio 2022
- .XARXA
-
- .NET 8
- Windows
-
- Windows 11
Prerequisits
- Visual Studio
-
- Visual Studio 2022
- .XARXA
-
- .NET 8
- Windows
-
- Windows 10
- Windows 11
- Servidor Windows
-
- Windows 2012 o posterior
Precondició
- Visual Studio ja està instal·lat
Al principi
Quan intento crear un servei del Windows al Visual Studio .NET, només hi ha plantilles del .NET Framework. També es pot crear en .NET (Core) i la plantilla s'anomena "Worker Service".
En aquest article, explicaré com utilitzar-ho per crear, registrar i executar un servei de Windows. El contingut de processament és mínim, de manera que si podeu confirmar que s'està executant com a servei de Windows, creeu la funció.
Crear un projecte
Inicieu Visual Studio. Seleccioneu Crea un projecte nou.
Introduïu al サービス
camp de cerca anterior i, a continuació, seleccioneu Servei de treballador de la llista.
"Serveis de Windows" és la versió de .NET Framework, que no té una versió de .NET.
El nom i la ubicació del projecte poden ser arbitraris. No afecta el servei al qual us registreu.
「. NET 8.0 està seleccionat i deixeu els valors per defecte per crear-lo.
El projecte ha estat creat.
Afegir biblioteques
En l'estat inicial, només té una funció de "servei" i no funcions específiques de Windows. Afegiu una biblioteca que pugui utilitzar un servei del Windows des del NuGet.
Feu clic amb el botó dret a Dependències i seleccioneu Administra els paquets NuGet.
Seleccioneu la pestanya Navega i introduïu al camp de Microsoft.Extensions.Hosting.WindowsServices
cerca.
Apareixerà a la llista, així que instal·leu-lo.
Fes clic a Aplica.
Es va afegir com a paquet.
Edició de programes
Aquesta vegada, crearé un servei que afegeixi text periòdicament a un fitxer de text com a Sr. / Sra.
Program.cs
Afegiu la funcionalitat del servei Windows de la següent manera:
var builder = Host.CreateApplicationBuilder(args);
// ↓ここから追加
builder.Services.AddWindowsService();
// ↑ここまで追加
builder.Services.AddHostedService<Worker>();
var host = builder.Build();
host.Run();
Worker.cs
Podeu canviar el nom de la classe arbitràriament, però per a aquest temps deixarem el valor per defecte.
Per defecte, només hi ha mètodes que es processen ExecuteAsync
quan s'executa el servei, però canviem-lo de la següent manera:
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);
}
}
}
Hem afegit un mètode nou i StopAsync
un mètode nouStartAsync
.
Com el seu nom indica, aquests mètodes es criden quan s'inicia el servei i quan s'atura.
El contingut del procés és simplement crear carpetes i escriure text, així que ometré l'explicació.
ExecuteAsync
El mètode continua fent un bucle amb stoppingToken fins que while
es marca per a la cancel·lació.
Afegiu el que while
voleu processar mentre s'executa el servei.
No obstant això, si escriviu només el procés que voleu moure, el servei s'executarà a ple rendiment, per la qual cosa Task.Delay
és bàsic moure'l mentre espereu un temps determinat amb el mètode.
Per defecte, està establert en 1 segon (1000 ms), així que si us plau, reescriviu-lo en qualsevol moment.
depurar
Podeu depurar des del Visual Studio. Tingueu la seguretat que en realitat no estareu registrats al servei.
Quan l'executeu, apareixerà la consola.
Si el procés és correcte, podeu veure que el fitxer s'ha creat.
Si voleu aturar la depuració, tanqueu la consola.
Si comproveu el registre, podeu veure que el procés d'inici del servei ha passat, però el procés de cancel·lació no. Per veure la terminació, heu de registrar-vos al servei de Windows per verificar-la.
assumpte
Per poder registrar-se en un servei de Windows, heu de publicar el programa. Feu clic amb el botó dret al projecte i trieu Publica.
Seleccioneu Carpetes.
La ubicació de la carpeta és agradable per defecte.
Es crearà la configuració de publicació, així que seleccioneu "Mostra tots els paràmetres".
Configureu-lo de la següent manera:
del nom del paràmetreComentaris | sobre el valor | |
---|---|---|
configuració | Alliberament (per defecte) | |
Marc de destinació | net8.0 (per defecte) | |
Modes de desplegament | Dependència del marc | Per separat per a l'entorn de registre de serveis. Si esteu instal·lant el temps d'execució de NEt 8, aquesta configuració està bé. |
Temps d'execució de destinació | guanyar-x64 | Si el sistema operatiu és un entorn de 32 bits, seleccioneu win-x86 |
Ubicació de destinació | Omissió | |
Creació d'un únic fitxer | SOBRE | |
Compilació ReadyToRun | arbitrari |
Després de la configuració, feu clic al botó "Envia".
Si es mostra "La publicació s'ha realitzat correctament" a l'extrem inferior esquerre, s'ha completat.
El fitxer de sortida es pot obrir fent clic a "Ubicació de destinació".
Col·locació del programa i inscripció en serveis
Inicieu sessió a l'entorn on voleu registrar el servei del Windows amb privilegis d'administrador.
Copieu el fitxer publicat a l'entorn on voleu registrar-lo com a servei de Windows. Podeu col·locar-lo en qualsevol carpeta, però tingueu en compte que el servei de Windows sempre farà referència al programa d'aquesta carpeta.
A més, si el fitxer publicat conté un fitxer amb l'extensió .pdb
, no el copieu en un entorn on pugui ser vist per una persona no especificada perquè conté informació de desenvolupament.
Un cop el fitxer estigui al seu lloc, registreu-lo com a servei de Windows. Utilitzeu l'ordre per registrar-vos. Feu clic amb el botó dret al menú Inici i seleccioneu "Terminal (Administrador)". Mr./Ms. s'executa en un entorn Windows 11, però en altres entorns, està bé obrir un símbol del sistema amb privilegis d'administrador.
En el cas del terminal, PowerShell pot estar obert primer, però és possible que PowerShell no pugui configurar-lo correctament, així que obriu el "Símbol del sistema".
Podeu registrar-lo amb el servei de Windows amb la següent ordre:
format
sc create "<サービス名>" start=auto binpath="<プログラム(.exe)のパス>"
Exemple d'entrada
sc create "WindowsServiceDotNet8" start=auto binpath="C:\Service\WindowsServiceDotNet8\WindowsServiceDotNet8.exe"
<サービス名>
és el nom que apareix a la llista de serveis de Windows. Podeu definir un nom de visualització independent, però si no especifiqueu un nom de visualització, aquest nom es mostrarà.
També afecta el registre, per la qual cosa es prefereixen els noms de servei alfanumèrics.
start=auto
és una configuració per iniciar automàticament el servei quan s'inicia Windows.
Si voleu iniciar-lo manualment, suprimiu aquesta descripció.
binpath
és el camí complet dels fitxers de programa.
Si executeu l'ordre i mostreu [SC] CreateService SUCCESS
, s'executarà correctament.
Els serveis que heu registrat haurien d'aparèixer a la llista.
Inicieu el servei i comproveu-ne el funcionament
Si voleu executar el servei, podeu iniciar-lo des de la pantalla del servei o amb la següent ordre.
sc start <サービス名>
L'ordre stop és la següent.
sc stop <サービス名>
Si atureu el servei, podeu verificar que el procés d'aturada s'està executant.
Afegir una descripció al servei
El camp de descripció del servei afegit està en blanc, però podeu afegir-lo amb l'ordre següent.
sc description <サービス名> "<説明文>"
Supressió d'un servei
Si voleu eliminar el servei, podeu fer-ho amb l'ordre següent. Heu de tenir privilegis d'administrador a l'indicador d'ordres.
sc delete <サービス名>