Створення сервісу для Windows в .NET 8
Робоче середовище
- Візуальна студія
-
- Visual Studio 2022
- .МЕРЕЖІ
-
- .NET 8
- Вікна
-
- Вікна 11
Передумови
- Візуальна студія
-
- Visual Studio 2022
- .МЕРЕЖІ
-
- .NET 8
- Вікна
-
- Вікна 10
- Вікна 11
- Сервер Windows
-
- Windows 2012 або новішої версії
Передумовою
- Visual Studio вже встановлено
На перших порах
Коли я намагаюся створити службу Windows в Visual Studio .NET, там тільки шаблони .NET Framework. Він також може бути створений в .NET (Core), а шаблон має назву "Worker Service".
У цій статті я поясню, як використовувати це для створення, реєстрації та запуску служби Windows. Вміст обробки мінімальний, тому, якщо ви можете підтвердити, що він працює як служба Windows, будь ласка, створіть функцію.
Створити проект
Запустіть Visual Studio. Виберіть Створити новий проект.
Введіть у サービス
поле пошуку вище, а потім виберіть Worker Service зі списку.
"Служби Windows" – це версія .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 секунда (1000 мс), тому будь ласка, перепишіть його в будь-який час.
Налагодження
Ви можете налагоджувати з Visual Studio. Будьте впевнені, що ви насправді не будете зареєстровані в сервісі.
Коли ви його запустите, з'явиться консоль.
Якщо процес виконано правильно, можна побачити, що файл створено.
Якщо ви хочете припинити налагодження, закрийте консоль.
Якщо ви перевірите журнал, то побачите, що процес запуску служби пройшов, а процес припинення – ні. Щоб побачити завершення, вам потрібно фактично зареєструватися в службі Windows, щоб підтвердити його.
випуск
Для того щоб мати можливість зареєструватися в службі Windows, необхідно опублікувати програму. Клацніть проект правою кнопкою миші та виберіть Опублікувати.
Виберіть Папки.
Розташування папки за замовчуванням приємне.
Налаштування публікації будуть створені, тому виберіть "Показати всі налаштування".
Налаштуйте його наступним чином:
Зауваження до назви | параметра | |
---|---|---|
Конфігурації | Випуск (за замовчуванням) | |
Цільова структура | net8.0 (за замовчуванням) | |
Режими розгортання | Залежність від фреймворків | Окремо для середовища реєстрації послуг. Якщо ви встановлюєте середовище виконання NEt 8, цей параметр є нормальним. |
Цільове середовище виконання | 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 <サービス名>