使用Topshelf创建自宿主的Windows服务程序
在传统的Windows服务开发过程中,需要添加一个服务安装程序,里面写安装,启动和停止服务等逻辑。现在,使用TopSelf可以简化这个过程。具体请看官网说明:
http://docs.topshelf-project.com/en/latest/index.html
开始前,先创建一个控制台程序,添加 Topshelf 程序包引用:
Install-Package Topshelf
首先,继承 ServiceControl 写一个应用服务类:
internal class AppService : ServiceControl { ILog log = LogManager.GetLogger(typeof(AppService)); public void Initialize() { log.Info("Initialize"); Console.WriteLine("Engine starting...."); EngineContext.Initialize(false); Console.WriteLine("Engine started"); } public bool Start(HostControl hostControl) { Console.WriteLine("Hosts starting...."); ServiceHostHelper.OpenWcfService(); Console.WriteLine("Hosts started"); return true; } public bool Stop(HostControl hostControl) { ServiceHostHelper.CloseWcfService(); return true; } }
然后,在主程序里面,写如下代码:
static void Main(string[] args) { try { HostFactory.Run(x => { x.RunAsLocalSystem(); x.StartAutomatically(); //x.StartManually(); var defaultName = GetDefaultServiceName(); var config = DXNConfig.Current.AppServer; x.SetServiceName("我的服务1"); x.SetDisplayName("我的服务1"); x.SetDescription("我的服务1描述"); x.Service(factory => { var service = new AppService(); service.Initialize(); return service; }); }); } catch (Exception ex) { try { LogManager.GetLogger(typeof(Program)).Fatal("AppServer launch error", ex); } catch { } //throw; } } }
这些服务名称性信息是可以修改的。
好了,现在编译,我们的程序就可以当服务使用了。
之后,就可以用命令行来安装服务:
@echo off %~d0 cd %~dp0 cd.. rem ApplicationServer.exe install -servicename "ApplicationServer" -displayname "ApplicationServer" -description "XX业务管理系统" ApplicationServer.exe install @echo 启动服务... ApplicationServer.exe start echo 启动结束
启动服务:
sc start "ApplicationServer"
停止服务:
sc stop "ApplicationServer"
卸载服务:
ApplicationServer.exe uninstall
运行第一个启动服务的批处理文件,将输出下面的内容:
Configuration Result: [Success] Name DEV_DXN_ApplicationServer [Success] DisplayName ApplicationServer [Success] Description XXX业务管理系统 [Success] ServiceName ApplicationServer Topshelf v3.0.105.0, .NET Framework v4.0.30319.34014 正在运行事务处理安装。 正在开始安装的“安装”阶段。 Installing DXN ApplicationServer service 正在安装服务 DXN_ApplicationServer... 已成功安装服务DXN_ApplicationServer。 正在日志 Application 中创建 EventLog 源 ApplicationServer... “安装”阶段已成功完成,正在开始“提交”阶段。 “提交”阶段已成功完成。 已完成事务处理安装。 启动服务... Configuration Result: [Success] Name DXN_ApplicationServer [Success] DisplayName ApplicationServer [Success] Description XX管理系统 [Success] ServiceName ApplicationServer Topshelf v3.0.105.0, .NET Framework v4.0.30319.34014 The ApplicationServer service is not installed.
过程全部完成。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构