Създаване на услуга за Windows в .NET 8
Работна среда
- Визуално студио
-
- Visual Studio 2022
- .НЕТЕН
-
- .NET 8
- Уиндоус
-
- Windows 11
Предпоставки
- Визуално студио
-
- Visual Studio 2022
- .НЕТЕН
-
- .NET 8
- Уиндоус
-
- Windows 10
- Windows 11
- Windows Server
-
- Windows 2012 или по-нова версия
Предпоставка
- Visual Studio вече е инсталиран
Отначало
Когато се опитам да създам услуга на Windows във Visual Studio .NET, има само шаблони за .NET Framework. Може да бъде създаден и в .NET (Core), а шаблонът се нарича "Worker Service".
В тази статия ще обясня как да използвате това, за да създадете, регистрирате и стартирате услуга на Windows. Съдържанието на обработката е минимално, така че ако можете да потвърдите, че работи като услуга на Windows, моля, създайте функцията.
Създаване на проект
Стартирайте Visual Studio. Изберете Създаване на нов проект.
Въведете в полето за サービス
търсене по-горе и след това изберете Услуга за работници от списъка.
"Windows Services" е версията на .NET Framework, която няма .NET версия.
Името и местоположението на проекта могат да бъдат произволни. Това не засяга услугата, за която се регистрирате.
「. NET 8.0 е избран и оставете настройките по подразбиране, за да го създадете.
Проектът е създаден.
Добавяне на библиотеки
В първоначалното състояние той има само функция "услуга" и няма специфични за Windows функции. Добавете библиотека, която може да се използва от услуга на Windows от NuGet.
Щракнете с десния бутон върху Зависимости и изберете Управление на NuGet пакети.
Изберете раздела Преглед и въведете в полето за Microsoft.Extensions.Hosting.WindowsServices
търсене.
Той ще се появи в списъка, така че го инсталирайте.
Кликнете върху Прилагане.
Добавен е като пакет.
Програми за редактиране
Този път ще създам услуга, която периодично добавя текст към текстов файл като г-н/г-жа.
Program.cs
Добавете функционалността на услугата Windows, както следва:
var builder = Host.CreateApplicationBuilder(args);
// ↓ここから追加
builder.Services.AddWindowsService();
// ↑ここまで追加
builder.Services.AddHostedService<Worker>();
var host = builder.Build();
host.Run();
Worker.cs
Можете да промените името на класа произволно, но за този път ще оставим по подразбиране.
По подразбиране има само методи, които се ExecuteAsync
обработват при изпълнение на услугата, но нека го променим, както следва:
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);
}
}
}
Добавихме нов метод и StopAsync
нов StartAsync
метод.
Както подсказва името, тези методи се извикват, когато услугата е стартирана и когато е спряна.
Съдържанието на процеса е просто създаване на папки и писане на текст, така че ще пропусна обяснението.
ExecuteAsync
Методът продължава да се повтаря със stoppingToken, докато while
не бъде маркиран за анулиране.
Добавете това, което while
искате да се обработва, докато услугата се изпълнява.
Въпреки това, ако напишете само процеса, който искате да преместите, услугата ще работи с пълен капацитет, така че Task.Delay
е основно да я преместите, докато чакате определено време с метода.
По подразбиране е настроен на 1 секунда (1000ms), така че моля, пренапишете го по всяко време.
Отстраняване
Можете да отстранявате грешки от Visual Studio. Бъдете сигурни, че всъщност няма да бъдете регистрирани в услугата.
Когато го стартирате, конзолата ще се появи.
Ако процесът е правилен, можете да видите, че файлът е създаден.
Ако искате да спрете отстраняването на грешки, затворете конзолата.
Ако проверите регистрационния файл, можете да видите, че процесът на стартиране на услугата е преминал, но процесът на прекратяване не е. За да видите прекратяването, трябва действително да се регистрирате в услугата Windows, за да го потвърдите.
Въпрос
За да можете да се регистрирате в услуга на Windows, трябва да публикувате програмата. Щракнете с десния бутон върху проекта и изберете Публикуване.
Изберете Папки.
Местоположението на папката е хубаво по подразбиране.
Настройките за публикуване ще бъдат създадени, така че изберете "Покажи всички настройки".
Настройте го, както следва:
за стойносттаЗабележки | на името на параметъра | |
---|---|---|
Конфигурация | Освобождаване (по подразбиране) | |
Целева рамка | net8.0 (по подразбиране) | |
Режими на внедряване | Зависимост от рамката | Отделно за средата за регистрация на услугата. Ако инсталирате NEt 8 runtime, тази настройка е ОК. |
Целева среда за изпълнение | win-x64 | Ако операционната система е 32-битова среда, изберете win-x86 |
Целево местоположение | По подразбиране | |
Създаване на един файл | НА | |
Компилация ReadyToRun | произволен |
След настройката щракнете върху бутона "Изпращане".
Ако в долния ляв ъгъл се покаже "Публикуването е успешно", то е завършено.
Изходният файл може да се отвори, като щракнете върху "Целево местоположение".
Класиране на програма и записване в услуги
Влезте в средата, в която искате да регистрирате услугата Windows с администраторски права.
Копирайте публикувания файл в средата, в която искате да го регистрирате като услуга на Windows. Можете да го поставите във всяка папка, но имайте предвид, че услугата Windows винаги ще се позовава на програмата в тази папка.
Също така, ако публикуваният файл съдържа файл с разширението .pdb
, не го копирайте в среда, където може да бъде видян от неуточнен човек, тъй като съдържа информация за разработка.
След като файлът е поставен, регистрирайте го като услуга на Windows. Използвайте командата, за да се регистрирате. Щракнете с десния бутон върху менюто "Старт" и изберете "Терминал (администратор)". Mr./Ms. работи в среда на Windows 11, но в други среди е добре да отворите команден ред с администраторски права.
В случай на терминал, PowerShell може да е отворен първи, но PowerShell може да не успее да го настрои правилно, така че отворете "Командния ред".
Можете да го регистрирате в услугата Windows със следната команда:
формат
sc create "<サービス名>" start=auto binpath="<プログラム(.exe)のパス>"
Примерен вход
sc create "WindowsServiceDotNet8" start=auto binpath="C:\Service\WindowsServiceDotNet8\WindowsServiceDotNet8.exe"
<サービス名>
е името, което се появява в списъка с услуги на Windows. Можете да зададете отделно показвано име, но ако не зададете показвано име, това име ще се покаже.
Това засяга и системния регистър, така че се предпочитат буквено-цифровите имена на услугите.
start=auto
е настройка за автоматично стартиране на услугата при стартиране на Windows.
Ако искате да го стартирате ръчно, изтрийте това описание.
binpath
е пълният път на програмните файлове.
Ако изпълните командата и [SC] CreateService SUCCESS
дисплея , тя е успешна.
Услугите, които сте регистрирали, трябва да се появят в списъка.
Стартирайте услугата и проверете нейната работа
Ако искате да стартирате услугата, можете да я стартирате от екрана на услугата или със следната команда.
sc start <サービス名>
Командата за спиране е следната.
sc stop <サービス名>
Ако спрете услугата, можете да проверите дали процесът на изключване се изпълнява.
Добавяне на описание към услугата
Полето за описание на добавената услуга е празно, но можете да го добавите със следната команда.
sc description <サービス名> "<説明文>"
Изтриване на услуга
Ако искате да изтриете услугата, можете да го направите със следната команда. Трябва да имате администраторски права в командния ред.
sc delete <サービス名>