如何通过微软.NET Core组件将IHostedService控制台程序部署为Windows服务?
用.NET Core官方组件将控制台服务转为Windows服务
当然可以!微软在.NET Core 2.1及后续版本中提供了官方的Windows服务集成方案,完全不需要依赖第三方工具就能实现你的需求,下面是具体的实现步骤:
1. 安装官方Windows服务集成包
首先,在你的项目中安装NuGet包 Microsoft.Extensions.Hosting.WindowsServices,这是微软官方提供的组件,专门用于将基于HostBuilder的控制台程序转为Windows服务。
2. 修改HostBuilder配置
在你的Program.cs中,更新HostBuilder的构建逻辑,添加UseWindowsService()扩展方法——这个方法会自动检测程序的运行模式:如果是作为Windows服务启动,就切换到服务模式;如果直接运行EXE,依然保持控制台模式(方便开发调试)。
示例代码如下:
using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; namespace MyConsoleService { class Program { static void Main(string[] args) { CreateHostBuilder(args).Build().Run(); } public static IHostBuilder CreateHostBuilder(string[] args) => Host.CreateDefaultBuilder(args) // 启用Windows服务支持 .UseWindowsService() .ConfigureServices((hostContext, services) => { // 注册你的后台服务(实现IHostedService接口的类) services.AddHostedService<MyBackgroundService>(); }); } }
这里的MyBackgroundService是你自己实现的后台服务类,需要继承BackgroundService(或者直接实现IHostedService),比如:
using Microsoft.Extensions.Hosting; using System.Threading; using System.Threading.Tasks; public class MyBackgroundService : BackgroundService { protected override async Task ExecuteAsync(CancellationToken stoppingToken) { // 这里写你的服务业务逻辑,比如定时任务、消息监听等 while (!stoppingToken.IsCancellationRequested) { // 示例逻辑:每秒执行一次(服务运行时可将日志写入Windows事件日志) await Task.Delay(1000, stoppingToken); } } }
3. 部署为Windows服务
完成代码修改后,先发布你的程序:
dotnet publish -c Release -o C:\Path\To\Publish\Folder
然后用Windows的sc命令安装服务:
sc create "MyCustomService" binPath="C:\Path\To\Publish\Folder\MyConsoleService.exe" displayName="我的自定义Windows服务" start=auto
注意:
start=auto表示服务随系统自动启动,如果你想手动启动可以改成start=demand。
安装完成后,启动服务:
sc start MyCustomService
如果需要停止或删除服务,使用以下命令:
# 停止服务 sc stop MyCustomService # 删除服务 sc delete MyCustomService
关键说明
- 当程序作为Windows服务运行时,不会显示控制台窗口,默认日志会写入Windows事件日志(你也可以通过配置日志提供器自定义输出位置)。
- 直接运行发布后的EXE文件时,程序依然会以控制台模式运行,方便你在开发阶段调试。
- 这种方式完全基于微软官方组件,不需要依赖任何第三方库,稳定性和兼容性更有保障。
内容的提问来源于stack exchange,提问作者R. van Diesen
相关产品推荐
相关产品推荐

