Создание службы для Windows в .NET 8

Страница обновлена :
Дата создания страницы :

Операционная среда

Визуальная студия
  • Визуальная студия 2022
.СЕТЬ
  • .NET 8
Виндоус
  • Windows 11

Необходимые условия

Визуальная студия
  • Визуальная студия 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" — это версия .NET Framework, которая не имеет версии .NET.

Название и местоположение проекта могут быть произвольными. Это не влияет на услугу, на которую вы регистрируетесь.

「. NET 8.0 и оставьте значения по умолчанию для его создания.

Проект создан.

Добавление библиотек

В исходном состоянии у него есть только функция «сервис» и нет функций, специфичных для Windows. Добавьте библиотеку, которую может использовать служба Windows из NuGet.

Щелкните правой кнопкой мыши Зависимости и выберите Управление пакетами NuGet.

Выберите вкладку Обзор и введите в Microsoft.Extensions.Hosting.WindowsServices поле поиска. Он появится в списке, поэтому установите его.

Нажмите «Применить».

Он был добавлен в виде пакета.

Программы редактирования

На этот раз я создам сервис, который периодически добавляет текст в текстовый файл в качестве Mr./Ms.

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. Используйте команду для регистрации. Щелкните правой кнопкой мыши меню «Пуск» и выберите «Терминал (Admin)». 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 <サービス名>