Я пытаюсь создать новую службу Windows в Visual Studio 2022 с последней версией LTS .NET (8.0).
Когда я создаю службу Windows в Visual Studio, я не могу выбрать современную версию .NET. Самая новая версия, которую я могу выбрать, — V4.
Какая здесь ситуация, это правильно? Нельзя ли использовать .NET 8 в службе Windows?
С уважением,
Отвечает ли это на ваш вопрос? Написание службы Windows в ядре .net
Конечно, это возможно Learn.microsoft.com/en-us/dotnet/core/extensions/… но у вас может не быть готового шаблона в Visual Studio для этого.
Вероятно, вы путаете .NET Framework и .NET Core. Последняя версия .NET Framework — 4.8. .NET 5 и более поздние версии на самом деле являются версиями .NET Core, из которых часть Core
удалена по маркетинговым причинам. Соответствующий шаблон .NET (Core) — это Worker-сервис.
Это возможно, и в Visual Studio есть шаблон. Проблема в том, что .NET 8 на самом деле является версией .NET Core. .NET 5 и более поздние версии на самом деле являются версиями .NET Core, в которых часть Core
удалена в маркетинговых целях.
Вам нужен шаблон Worker Service, доступный как минимум начиная с версии .NET Core 3 (возможно, даже 2). При этом создается кроссплатформенная фоновая служба, которую можно разместить в Linux или Windows путем добавления соответствующего пакета NuGet.
Сам шаблон создает класс Worker, производный от BackgroundService, и запускает его:
Program.cs содержит только это
using App.WorkerService;
HostApplicationBuilder builder = Host.CreateApplicationBuilder(args);
builder.Services.AddHostedService<Worker>();
IHost host = builder.Build();
host.Run();
Начальный рабочий класс
namespace App.WorkerService;
public sealed class Worker(ILogger<Worker> logger) : BackgroundService
{
protected override async Task ExecuteAsync(CancellationToken stoppingToken)
{
while (!stoppingToken.IsCancellationRequested)
{
logger.LogInformation("Worker running at: {time}", DateTimeOffset.Now);
await Task.Delay(1_000, stoppingToken);
}
}
}
Этот проект может работать где угодно. Создать службу Windows с помощью BackgroundService показывает изменения, необходимые для размещения ее в качестве службы. Самый важный из них — установить Microsoft.Extensions.Hosting.WindowsServices
и вызвать AddWindowsService
, чтобы зарегистрировать службу и разрешить управление ею с помощью сервисных команд.
Службы обычно запускаются с использованием учетных записей с ограниченным доступом, которые не могут просто регистрировать службы. Администратор может установить службу с помощью пакета установщика Windows. Создать установщик службы Windows показывает, как создать установщик для этого случая.
Другой вариант — использовать sc create из командной строки, чтобы зарегистрировать исполняемый файл в качестве службы Windows.
sc create TestService binpath= C:\Path\To\myservice.exe
В PowerShell то же самое можно сделать с помощью команды New-Service.
New-Service -Name "TestService" -BinaryPathName 'C:\Path\To\myservice.exe'
Большое спасибо за ваш исчерпывающий ответ. Именование Microsoft очень запутанное, и это проясняет ситуацию :-)
Как я предполагаю, вы пытаетесь выбрать .Net Framework (а не ядро .Net), последняя версия которого в настоящее время составляет 4.8.1...