如何使用F#创建.NET 6自安装服务(仅用标准.NET类,不调用WinAPI)
.NET 6 F# 实现无WinAPI自安装服务方案
前置说明
.NET 5+ 已移除System.Configuration.Install模块,可通过微软官方提供的标准Microsoft.Extensions.Hosting.WindowsServices包实现服务适配,全程仅调用标准.NET类,无需自行封装WinAPI。
实现步骤
1、依赖引入
创建F#控制台/Worker Service项目,引入NuGet包Microsoft.Extensions.Hosting.WindowsServices,该包为官方原生提供,完全符合标准类库使用要求。
2、编写业务服务逻辑
继承官方BackgroundService类实现你的服务业务:
open Microsoft.Extensions.Hosting open Microsoft.Extensions.Logging open System.Threading open System.Threading.Tasks type 你的自定义服务(logger: ILogger<你的自定义服务>) = inherit BackgroundService() override _.ExecuteAsync stoppingToken = task { // 这里写你的服务业务逻辑 while not stoppingToken.IsCancellationRequested do logger.LogInformation("服务运行中,当前时间:{Time}", System.DateTime.Now) do! Task.Delay(10000, stoppingToken) } :> Task
3、配置服务适配主机
调用UseWindowsService()方法自动适配Windows服务生命周期,无需手动处理服务启动、停止的底层逻辑:
open Microsoft.Extensions.DependencyInjection open System.Diagnostics open System.IO // 处理安装/卸载指令 let 处理服务操作 (args: string array) = let 自定义服务名 = "你自己定义的唯一服务名" let 当前程序路径 = Process.GetCurrentProcess().MainModule.FileName // 安装逻辑 if args |> Array.contains "--install" then // 调用系统自带sc命令创建服务,仅使用标准Process类,无WinAPI调用 let 创建服务 = ProcessStartInfo( FileName = "sc", Arguments = $"create {自定义服务名} binPath= \"{当前程序路径}\" start= auto", UseShellExecute = true, Verb = "runas" // 自动请求管理员权限 ) Process.Start(创建服务).WaitForExit() // 启动服务 let 启动服务 = ProcessStartInfo( FileName = "sc", Arguments = $"start {自定义服务名}", UseShellExecute = true, Verb = "runas" ) Process.Start(启动服务).WaitForExit() printfn "服务安装并启动成功" exit 0 // 卸载逻辑 elif args |> Array.contains "--uninstall" then // 停止服务 let 停止服务 = ProcessStartInfo( FileName = "sc", Arguments = $"stop {自定义服务名}", UseShellExecute = true, Verb = "runas" ) Process.Start(停止服务).WaitForExit() // 删除服务 let 删除服务 = ProcessStartInfo( FileName = "sc", Arguments = $"delete {自定义服务名}", UseShellExecute = true, Verb = "runas" ) Process.Start(删除服务).WaitForExit() printfn "服务卸载完成" exit 0 [<EntryPoint>] let main args = // 优先处理安装卸载指令 处理服务操作 args // 正常服务运行逻辑 let host = Host.CreateDefaultBuilder(args) .ConfigureServices(fun services -> services.AddHostedService<你的自定义服务>() |> ignore ) .UseWindowsService() // 核心适配逻辑,官方封装无需自行处理底层API .Build() host.Run() 0
使用方式
- 调试:直接双击运行生成的exe,以控制台模式运行,可直接查看日志
- 安装:右键选择「以管理员身份运行」命令行,执行
你的程序名.exe --install - 卸载:右键选择「以管理员身份运行」命令行,执行
你的程序名.exe --uninstall
内容的提问来源于stack exchange,提问作者johanemeralddoeoe
相关产品推荐
相关产品推荐

