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

.NET 8 Windows Service如何获取sc.exe启动参数?

在.NET 8中获取Windows Service启动参数的方法

方法1:结合ServiceBase兼容模式获取

.NET 8虽推荐使用Worker作为HostedService,但仍可通过传统ServiceBase类获取启动参数,步骤如下:

  • 自定义继承ServiceBase的类,重写OnStart方法直接拿到sc.exe传入的参数
  • 在Program.cs中整合该类与Worker,用它承载服务启停逻辑

示例代码:

// 自定义服务类
public class CustomWindowsService : ServiceBase
{
    private readonly IHost _host;

    public CustomWindowsService(IHost host)
    {
        _host = host;
    }

    protected override void OnStart(string[] args)
    {
        // 此处直接获取启动参数并处理
        foreach (var arg in args)
        {
            Console.WriteLine($"启动参数: {arg}");
        }
        // 启动Worker服务
        _host.StartAsync().Wait();
    }

    protected override void OnStop()
    {
        _host.StopAsync().Wait();
        _host.Dispose();
    }
}

// Program.cs
var builder = Host.CreateDefaultBuilder(args)
    .ConfigureServices(services =>
    {
        services.AddHostedService<Worker>();
        services.AddSingleton<CustomWindowsService>();
    });

if (WindowsServiceHelpers.IsWindowsService())
{
    var host = builder.Build();
    var service = host.Services.GetRequiredService<CustomWindowsService>();
    ServiceBase.Run(service);
}
else
{
    await builder.Build().RunAsync();
}

方法2:通过ServiceController读取注册参数

若不想依赖ServiceBase,可在Worker中借助ServiceController读取服务注册时配置的启动参数:

  • 先安装System.ServiceProcess NuGet包
  • 在Worker的ExecuteAsync方法中,通过服务名称获取其StartParameters

示例代码:

using System.ServiceProcess;

public class Worker : BackgroundService
{
    private readonly ILogger<Worker> _logger;

    public Worker(ILogger<Worker> logger)
    {
        _logger = logger;
    }

    protected override async Task ExecuteAsync(CancellationToken stoppingToken)
    {
        if (WindowsServiceHelpers.IsWindowsService())
        {
            string serviceName = "你的服务名称";
            using var serviceController = new ServiceController(serviceName);
            string startArgs = serviceController.StartParameters;
            if (!string.IsNullOrEmpty(startArgs))
            {
                string[] args = startArgs.Split(' ', StringSplitOptions.RemoveEmptyEntries);
                foreach (var arg in args)
                {
                    _logger.LogInformation("启动参数: {Arg}", arg);
                }
            }
        }

        while (!stoppingToken.IsCancellationRequested)
        {
            _logger.LogInformation("Worker运行中: {Time}", DateTimeOffset.Now);
            await Task.Delay(1000, stoppingToken);
        }
    }
}

注意:此方法仅能获取sc create命令注册服务时,binPath中配置的固定参数,无法获取启动时临时传入的参数。

方法3:读取注册表获取启动参数

Windows服务的启动参数会存储在注册表中,路径为HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\[你的服务名称]\ImagePath,可在Worker中读取该注册表项解析参数:

using Microsoft.Win32;

protected override async Task ExecuteAsync(CancellationToken stoppingToken)
{
    if (WindowsServiceHelpers.IsWindowsService())
    {
        string serviceName = "你的服务名称";
        using var key = Registry.LocalMachine.OpenSubKey($"SYSTEM\\CurrentControlSet\\Services\\{serviceName}");
        if (key != null)
        {
            string imagePath = key.GetValue("ImagePath") as string;
            if (!string.IsNullOrEmpty(imagePath))
            {
                // 解析可执行文件路径与参数部分
                int quoteIndex = imagePath.IndexOf('"');
                if (quoteIndex != -1)
                {
                    int endQuoteIndex = imagePath.IndexOf('"', quoteIndex + 1);
                    if (endQuoteIndex != -1)
                    {
                        string argsPart = imagePath.Substring(endQuoteIndex + 1).Trim();
                        if (!string.IsNullOrEmpty(argsPart))
                        {
                            string[] args = argsPart.Split(' ', StringSplitOptions.RemoveEmptyEntries);
                            foreach (var arg in args)
                            {
                                _logger.LogInformation("启动参数: {Arg}", arg);
                            }
                        }
                    }
                }
            }
        }
    }

    // 服务核心逻辑
}

内容的提问来源于stack exchange,提问作者FoxScully

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 17:25:00