You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

能否用.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 06:21:42