迷恋自留地 发表于 2021-7-24 10:57

C# Topshelf 搭建 Windows 服务

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

### 第一步:创建名为 TopshelfDemo 的控制台应用程序
###第二步:通过 Nuget 安装 Topshelf 包
![](https://img-blog.csdnimg.cn/20210710150431250.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQwNzMyMzM2,size_1,color_FFFFFF,t_70)
### 第三步:Toshelf 配置,代码并不多下面都有注释
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210710150606268.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQwNzMyMzM2,size_1,color_FFFFFF,t_70)


```csharp
using System;
using Topshelf;

namespace TopshelfDemo
{
    class Program
    {
      static void Main(string[] args)
      {
            try
            {
                // 配置和运行宿主服务
                HostFactory.Run(x =>                                 //1
                {
                  x.Service<Service>(s =>                        //2
                  {
                        // 指定服务类型。这里设置为 Service
                        s.ConstructUsing(name => new Service());   //3

                        // 当服务启动后执行什么
                        s.WhenStarted(tc => tc.Start());            //4

                        // 当服务停止后执行什么
                        s.WhenStopped(tc => tc.Stop());               //5
                  });

                  // 服务用本地系统账号来运行
                  x.RunAsLocalSystem();                            //6

                  // 服务描述信息
                  x.SetDescription("我的项目服务");      //7
                  // 服务显示名称
                  x.SetDisplayName("MyProjectServiceShowName");                     //8
                  // 服务名称
                  x.SetServiceName("MyProjectService");                     //9
                });
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex);
            }
      }
    }

    public class Service
    {
      public void Start() {
            //To do something
      }
      public void Stop() {
            //To do something
      }
    }
}
```
### 第四步:安装服务

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

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

  由于 .net core 依赖 runtimes 所以我们需要发布以下程序,并且选择独立项目就ok啦。
 ![](https://img-blog.csdnimg.cn/2021071015085812.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQwNzMyMzM2,size_1,color_FFFFFF,t_70)
 
![双击安装](https://img-blog.csdnimg.cn/20210710151253791.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQwNzMyMzM2,size_16,color_FFFFFF,t_70)
到这里我出现了问题提示 TopshelfDemo.exe install 无法安装,根据提示执行` ./TopshelfDemo.exe install`
就安装ok。
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210718113742687.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQwNzMyMzM2,size_1,color_FFFFFF,t_70)
失败提示信息:`The ** service can only be installed as an administrator`

解决方案:右击**.exe文件,属性-》兼容性-》勾选以管理员身份运行
![](https://img-blog.csdnimg.cn/20210718114332851.png)
![](https://img-blog.csdnimg.cn/20210718132431676.png)



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

后面可以搭配`Quartz`实现任务调度
https://editor.csdn.net/md/?articleId=118635391
https://www.cnblogs.com/netcore5/p/15026379.html

miocaro507 发表于 2021-7-24 12:13

不错,好用!{:1_893:}

TRS 发表于 2021-7-24 13:34

不错,学到了。
页: [1]
查看完整版本: C# Topshelf 搭建 Windows 服务