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

