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

.NET 7.0 Worker Service如何仅作为Windows服务运行,禁止控制台启动?

阻止.NET Worker Service以非服务方式启动的方法

要让调用了UseWindowsService()的Worker Service只能作为Windows服务运行,禁止双击启动为控制台应用,可以通过以下两种方式实现:

方法一:在入口处提前判断运行环境

在程序Main方法中先检查当前进程是否以Windows服务身份运行,若不是则弹出提示并退出程序:

using Microsoft.Extensions.Hosting;
using System;
using System.Diagnostics;

namespace WorkerServiceDemo
{
    internal class Program
    {
        static void Main(string[] args)
        {
            // 判断是否为Windows服务运行环境
            if (!IsRunningAsService())
            {
                Console.WriteLine("此应用程序只能作为Windows服务运行,请通过服务管理器启动。");
                Console.WriteLine("按任意键退出...");
                Console.ReadKey();
                return;
            }

            var host = Host.CreateDefaultBuilder(args)
                .UseWindowsService()
                .ConfigureServices(services =>
                {
                    services.AddHostedService<Worker>();
                })
                .Build();

            host.Run();
        }

        private static bool IsRunningAsService()
        {
            // 服务进程默认运行在Session 0,且非交互式
            var currentProcess = Process.GetCurrentProcess();
            return currentProcess.SessionId == 0 && !Environment.UserInteractive;
        }
    }
}

如果想要和旧.NET Framework服务一样弹出图形化提示框,需添加System.Windows.Forms引用,替换控制台输出为:

System.Windows.Forms.MessageBox.Show(
    "此应用程序只能作为Windows服务运行,请使用服务管理器启动。",
    "启动错误",
    System.Windows.Forms.MessageBoxButtons.OK,
    System.Windows.Forms.MessageBoxIcon.Error
);

方法二:通过服务生命周期类型判断

构建Host后,检查其生命周期是否为Windows服务专属的生命周期,若不是则退出:

using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Hosting.WindowsServices;
using System;

namespace WorkerServiceDemo
{
    internal class Program
    {
        static void Main(string[] args)
        {
            var hostBuilder = Host.CreateDefaultBuilder(args)
                .UseWindowsService()
                .ConfigureServices(services =>
                {
                    services.AddHostedService<Worker>();
                });

            var host = hostBuilder.Build();

            // 验证当前生命周期是否为Windows服务生命周期
            if (!(host.Services.GetService(typeof(IHostLifetime)) is WindowsServiceLifetime))
            {
                Console.WriteLine("此应用程序只能作为Windows服务运行,请通过服务管理器启动。");
                Console.ReadKey();
                return;
            }

            host.Run();
        }
    }
}

注意事项

  • 第一种方法依赖Windows服务默认运行在Session 0的特性,适用于绝大多数常规场景;
  • 使用图形化提示时,需确保项目已引用System.Windows.Forms,且发布目标平台选择Windows;
  • 测试时注意:注册服务后通过服务管理器启动正常,双击程序则会触发提示并退出。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 07:03:33