.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.ServiceProcessNuGet包 - 在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
相关产品推荐
相关产品推荐

