使用Topshelf 搭建 Windows 服务

32 2020-3-6 10:00

Topshelf 是一个用来部署基于.NET Framework 开发的服务的框架。简化服务创建于部署过程,并且支持控制台应用程序部署为服务。本文基于 .net core 控制台应用程序部署为服务(.net Framework 可用)。


1:创建名为 TopshelfDemo 的控制台应用程序。


2:通过 Nuget 安装 Topshelf 包。


3:Toshelf 配置,代码并不多下面都有注释。

try
            {
                // 配置和运行宿主服务
                HostFactory.Run(x =>                                 
                {
                    x.Service<Service>(s =>                       
                    {
                        // 指定服务类型。这里设置为 Service
                        s.ConstructUsing(name => new Service());     
                        // 当服务启动后执行什么
                        s.WhenStarted(tc => tc.Start());              
                        // 当服务停止后执行什么
                        s.WhenStopped(tc => tc.Stop());              
                    });
                    // 服务用本地系统账号来运行
                    x.RunAsLocalSystem();                           
                    // 服务描述信息
                    x.SetDescription("我的项目服务");      
                    // 服务显示名称
                    x.SetDisplayName("ZhuXianFeiServiceShowName");                     
                    // 服务名称
                    x.SetServiceName("ZhuXianFeiService");

                    //调用QuartzServer队列服务用这段
                    /*
                    x.Service(factory =>
                    {
                        QuartzServer server = QuartzServerFactory.CreateServer();
                        server.Initialize();
                        return server;
                    });
                    */


                });
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex);
            }

4:安装服务


  确保项目正常生成,然后通过管理员权限打开 cmd 命令窗口,找到项目所在的 Debug 目录,输入命令:文件所在路径\TopshelfDemo.exe install。


  如果是使用 .net core 的小伙伴你会发现 Debug下压根没有 TopshelfDemo.exe ,这不是扯淡呢么,别急往下看。


  由于 .net core 依赖 runtimes 所以我们需要发布以下程序,并且选择独立项目就ok啦。

这时你在布后的路径下就可以找到 TopshelfDemo.exe 啦。

这时服务就安装完毕了,我们可以通过 Windows 服务中查看。

卸载服务命令:TopshelfDemo.exe uninstall 


也可以通过 sc delete MyProjectService 进行删除


好了,到这里就完事儿了,哪里有问题希望大家猛烈拍砖以便修正~