Создание службы для Windows используя net core

  • Михаил
  • 8 мин. на прочтение
  • 76
  • 30 May 2022
  • 30 May 2022

В .NET Core вы можете создать службу для Windows, используя пакет Microsoft.Extensions.Hosting.WindowsServices. Этот пакет позволяет вам создавать Windows-службы, используя хост контейнер, который знаком по другим типам приложений .NET Core. Одним из важнейших компонентов ОС Windows являются службы. Фактически это отдельные приложения, которые не имеют графического интерфейса и которые выполняют различные задачи в фоновом режиме. Службы могут быть запущены при старте операционной системы, так и в любой другой момент работы пользователя. Распространенным примером служб являются различные веб-серверы, которые в фоновом режиме прослушивают определенный порт на наличие подключений, и если подключения имеются, то взаимодействуют с ними. Это могут быть также различные вспомогательные сервисы обновлений для других установленных программ, которые обращаются к серверу, чтобы узнать, есть ли новая версия приложения.

Вот пример реализации простой службы для Windows на .NET Core:

1. Создайте новое консольное приложение .NET Core.

2. Добавьте в проект пакет NuGet "Microsoft.Extensions.Hosting.WindowsServices".

3. Создайте класс, наследующий от BackgroundService, который будет содержать логику вашей службы:

public class MyWindowsService : BackgroundService
{
   private readonly ILogger<MyWindowsService> _logger;
   public MyWindowsService(ILogger<MyWindowsService> logger)
   {
       _logger = logger;
   }
   protected override async Task ExecuteAsync(CancellationToken stoppingToken)
   {
       while (!stoppingToken.IsCancellationRequested)
       {
           _logger.LogInformation("Выполняется основная логика службы");
           await Task.Delay(5000, stoppingToken);
       }
   }
}

4. Настройте хост в Program.cs:

public static async Task Main(string[] args)
{
   await CreateHostBuilder(args).Build().RunAsync();
}
public static IHostBuilder CreateHostBuilder(string[] args) =>
   Host.CreateDefaultBuilder(args)
       .UseWindowsService()
       .ConfigureServices((_, services) =>
           services.AddHostedService<MyWindowsService>());

В этом примере мы создаем простую службу, которая каждые 5 секунд записывает сообщение в журнал.

Чтобы установить службу на Windows, можно использовать следующие команды:

sc create MyWindowsService binPath= "путь\к\приложению.exe"
sc start MyWindowsService

Или использовать утилиту sc.exe из командной строки.

Вот еще несколько примеров использования службы Windows на .NET Core:

1. Использование конфигурации: Вы можете использовать конфигурацию .NET Core для настройки службы, например, интервал времени между выполнениями задач.

public class MyWindowsService : BackgroundService
{
   private readonly IConfiguration _configuration;
   private readonly ILogger<MyWindowsService> _logger;
   public MyWindowsService(IConfiguration configuration, ILogger<MyWindowsService> logger)
   {
       _configuration = configuration;
       _logger = logger;
   }
   protected override async Task ExecuteAsync(CancellationToken stoppingToken)
   {
       var interval = _configuration.GetValue<int>("ServiceInterval");
       while (!stoppingToken.IsCancellationRequested)
       {
           _logger.LogInformation("Выполняется основная логика службы");
           await Task.Delay(interval * 1000, stoppingToken);
       }
   }
}

2. Взаимодействие с другими сервисами: Вы можете интегрировать вашу службу с другими сервисами, например, отправлять данные в базу данных или отправлять сообщения в очередь.

public class MyWindowsService : BackgroundService
{
   private readonly IMyDataService _dataService;
   private readonly ILogger<MyWindowsService> _logger;
   public MyWindowsService(IMyDataService dataService, ILogger<MyWindowsService> logger)
   {
       _dataService = dataService;
       _logger = logger;
   }
   protected override async Task ExecuteAsync(CancellationToken stoppingToken)
   {
       while (!stoppingToken.IsCancellationRequested)
       {
           var data = await _dataService.GetDataAsync();
           _logger.LogInformation("Получены данные: {Data}", data);
           await Task.Delay(60000, stoppingToken);
       }
   }
}

3. Обработка ошибок и управление жизненным циклом: Вы можете добавить обработку ошибок и управление жизненным циклом службы.

public class MyWindowsService : BackgroundService
{
   private readonly ILogger<MyWindowsService> _logger;
   public MyWindowsService(ILogger<MyWindowsService> logger)
   {
       _logger = logger;
   }
   protected override async Task ExecuteAsync(CancellationToken stoppingToken)
   {
       try
       {
           while (!stoppingToken.IsCancellationRequested)
           {
               _logger.LogInformation("Выполняется основная логика службы");
               await Task.Delay(5000, stoppingToken);
           }
       }
       catch (Exception ex)
       {
           _logger.LogError(ex, "Произошла ошибка в службе");
       }
   }
   public override Task StartAsync(CancellationToken cancellationToken)
   {
       _logger.LogInformation("Служба запущена");
       return base.StartAsync(cancellationToken);
   }
   public override Task StopAsync(CancellationToken cancellationToken)
   {
       _logger.LogInformation("Служба остановлена");
       return base.StopAsync(cancellationToken);
   }
}

Эти примеры демонстрируют основные принципы создания службы Windows на .NET Core. Вы можете расширять и адаптировать их в соответствии с вашими требованиями.