能否用.NET Core编写单一代码实现Windows服务与Linux守护进程?
当然可以用一套.NET Core代码实现跨平台服务/守护进程!
完全不用分别编写系统依赖的启动代码,微软在.NET Core 3.0及以后版本中,通过Microsoft.Extensions.Hosting库提供了跨平台的服务托管能力,能自动适配Windows服务和Linux Systemd守护进程,核心业务逻辑完全通用。
具体实现步骤:
第一步:添加必要的NuGet包
新建控制台项目后,安装以下包:dotnet add package Microsoft.Extensions.Hosting dotnet add package Microsoft.Extensions.Hosting.WindowsServices dotnet add package Microsoft.Extensions.Hosting.Systemd这几个包分别提供通用托管、Windows服务适配、Linux Systemd适配的能力,而且它们会自动识别运行环境,不会在非目标系统中生效。
第二步:编写通用的后台业务逻辑
写一个继承自BackgroundService的类,这部分是你的核心业务,和操作系统完全无关:public class Worker : BackgroundService { private readonly ILogger<Worker> _logger; public Worker(ILogger<Worker> logger) { _logger = logger; } protected override async Task ExecuteAsync(CancellationToken stoppingToken) { while (!stoppingToken.IsCancellationRequested) { _logger.LogInformation("服务正在运行,时间:{Time}", DateTimeOffset.Now); await Task.Delay(1000, stoppingToken); } } }第三步:配置HostBuilder自动适配系统
在Program.cs里配置主机,只需要同时添加UseWindowsService()和UseSystemd(),框架会自动判断当前运行的系统:var host = Host.CreateDefaultBuilder(args) .ConfigureServices(services => { services.AddHostedService<Worker>(); }) .UseWindowsService() // 仅在Windows系统生效 .UseSystemd() // 仅在Linux系统生效 .Build(); await host.RunAsync();
部署方式(代码无需修改):
Windows平台:
发布项目后,用命令注册为Windows服务:sc create "MyService" binPath="C:\path\to\your\published\exe.exe"或者用PowerShell的
New-Service命令,启动服务后就会以Windows服务形式运行。Linux平台:
发布项目后,创建一个Systemd服务配置文件(比如myapp.service):[Unit] Description=My .NET Core Service After=network.target [Service] ExecStart=/path/to/your/published/exe Restart=always User=www-data [Install] WantedBy=multi-user.target然后将文件放到
/etc/systemd/system/目录,执行以下命令启用并启动服务:sudo systemctl daemon-reload sudo systemctl enable myapp.service sudo systemctl start myapp.service
这样一套代码就能在两个系统上分别以服务/守护进程的形式运行,完全不用拆分系统依赖的启动逻辑,核心业务只需要维护一份就行。
内容的提问来源于stack exchange,提问作者BWA
相关产品推荐
相关产品推荐

