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

如何使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 02:36:05