使用Topshelf框架操作Windows服务

一、介绍

Topshelf是一个开源的跨平台的宿主服务框架,支持Windows和Mono,只需要几行代码就可以构建一个很方便使用的服务宿主。

Topshelf是创建Windows服务的另一种方。它极大的简化服务创建与部署过程,它支持将控制台应用程序部署为服务。

下载

1、官网:http://topshelf-project.com/这里面有详细的文档及下载

2、Topshelf的代码托管在 http://github.com/topshelf/Topshelf/

二、使用

1、Topshelf 安装

通过 NuGet 安装 Topshelf 包。

Install-Package Topshelf

2、Topshelf 配置

以下是我们以 Topshelf 来部署的一个 gRPC 服务代码,Topshelf 关键配置在 Main 方法内,更多的配置建议阅读一下 官方文档

class Program
{
  static void Main(string[] args)
  {
    // 配置和运行宿主服务
    HostFactory.Run(x =>
    {
      // 指定服务类型。这里设置为 CacheService
      x.Service<CacheService>(s =>
      {
                s.ConstructUsing(name => new CacheService());// 通过 new CacheService() 构建一个服务实例
                s.WhenStarted(tc => tc.Start());// 当服务启动后执行什么
                s.WhenStopped(tc => tc.Stop());// 当服务停止后执行什么
      });

      x.RunAsLocalSystem();// 服务用本地系统账号来运行,身份标识,有好几种方式,如:x.RunAs("username", "password");  x.RunAsPrompt(); x.RunAsNetworkService(); 等

      x.SetDescription("缓存服务");// 服务描述信息
      x.SetDisplayName("CacheService");// 服务显示名称
      x.SetServiceName("CacheService"); // 服务名称
    });
  }
}

public class CacheService
{
  private readonly string host = ConfigurationManager.AppSettings["Host"];
  private readonly string port = ConfigurationManager.AppSettings["Port"];

  readonly Server server;
  public CacheService()
  {
    server = new Server
    {
      Services = { MDCache.BindService(new CacheServiceImpl()) },
      Ports = { new ServerPort(host, Convert.ToInt32(port), ServerCredentials.Insecure) }
    };
  }
  public void Start() { server.Start(); }
  public void Stop() { server.ShutdownAsync(); }
}

3、安装服务

通过以上配置,确保程序集 Build 成功后,进入 bin\Debug 目录下,执行 install 命令,一个 Windows 服务就诞生了。(如果出现需要以管理员身份启动的提示,重新以管理员身份启动 cmd )。

xxx.exe install

4、启动服务

启动:

xxx.exe start

也可以安装成功后我们可以在 Windows 服务下找到并启动它。

注意:因为 serviceName 必须是唯一的,如果我们希望在同一台机器上运行多个相同的服务,那么我们需要注释掉硬编码设置的 ServiceName 和 DisplayName ,然后通过命令参数来动态指定服务名称。

// 服务显示名称
//x.SetDisplayName("CacheService");
// 服务名称
//x.SetServiceName("CacheService");
xxx.exe install -servicename cacheService
xxx.exe install -servicename cacheService1

5、服务卸载

卸载和启动的命令保持一致,只需要把 install 改成 uninstall 。

指定服务名称卸载

三、Service Configuration 服务配置

以上为自定义模式,还有一种叫简单模式。继承ServiceControl接口,实现该接口即可。

class Program
{
    public static void Main(string[] args)
    {
        var logCfg = new FileInfo(AppDomain.CurrentDomain.BaseDirectory + "log4net.config");
        XmlConfigurator.ConfigureAndWatch(logCfg);

        HostFactory.Run(x =>
        {
            x.Service<TownCrier>();
            x.RunAsLocalSystem();

            x.SetDescription("Sample Topshelf Host服务的描述");
            x.SetDisplayName("Stuff显示名称");
            x.SetServiceName("Stuff服务名称");
        });
    }
}

public class TownCrier : ServiceControl
{
    private Timer _timer = null;
    readonly ILog _log = LogManager.GetLogger(typeof(TownCrier));
    public TownCrier()
    {
        _timer = new Timer(1000) { AutoReset = true };
        _timer.Elapsed += (sender, eventArgs) => _log.Info(DateTime.Now);

    }
    public bool Start(HostControl hostControl)
    {
        _log.Info("TopshelfDemo is Started");
        _timer.Start();
        return true;
    }

    public bool Stop(HostControl hostControl)
    {
        throw new NotImplementedException();
    }
}

到此这篇关于使用Topshelf框架操作Windows服务的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • 使用Topshelf组件构建简单的Windows服务

    很多时候都在讨论是否需要了解一个组件或者一个语言的底层原理这个问题,其实我个人觉得,对于这个问题,每个人都有自己的看法,个人情况不同,选择的方式也就会不同了.我个人觉得无论学习什么,都应该尝试着去了解对应的原理和源码(这里就不要急着吐槽,容我说完).对底层的了解不是为了让你写出类似的东西,让你写也不可能写的出来,重写一个就需要以此修改整个底层结构,了解底层知识只是为了让你可以在写业务代码时,选择合适的方式,以此使底层与业务层配合达到效率最佳.任何一种方式有坏有好,需要合适的选择. 如果觉得楼主以

  • .NET Core使用Topshelf方式创建Windows服务的全过程记录

    前言 Topshelf是一个.NET Standard库,它消除了在.NET Framework和.NET Core中创建Windows服务的那些麻烦. 安装 Install-Package Topshelf 代码 using System; using System.Collections.Generic; using System.Text; using Topshelf; namespace ConsoleApp2222 { public class LoggingService : Se

  • C#用Topshelf创建Windows服务的步骤分享

    一.项目创建 创建一个控制台应用程序,项目右键->管理 NuGet 程序包->Topshelft及Topshelf.Log4Net. 二.Topshelf配置 一般来说,服务都会设置每隔多长时间执行一次任务,这里使用System.Threading.Timer来做个简单的日志记录,将日志写入到Debug\Log文件夹下.     2.1.Log4Net配置 新建一个log4net.config的配置文件,在其属性的复制到输出目录项下选择始终复制. <?xml version="

  • 使用Topshelf框架操作Windows服务

    一.介绍 Topshelf是一个开源的跨平台的宿主服务框架,支持Windows和Mono,只需要几行代码就可以构建一个很方便使用的服务宿主. Topshelf是创建Windows服务的另一种方.它极大的简化服务创建与部署过程,它支持将控制台应用程序部署为服务. 下载 1.官网:http://topshelf-project.com/这里面有详细的文档及下载 2.Topshelf的代码托管在 http://github.com/topshelf/Topshelf/ 二.使用 1.Topshelf

  • C#操作Windows服务类System.ServiceProcess.ServiceBase

    一.Windows服务 1.Windows服务应用程序是一种需要长期运行的应用程序,它适合服务器环境. 2.无用户界面,任何消息都会写进Windows事件日志. 3.随计算机启动而启动,不需要用户一定登录Windows. 4.通过服务控制管理器,可以终止.暂停及当需要时启动Windows服务. 二.体系结构 System.ServiceProcess命令空间 1.类继承关系: Object Component ServiceBase ServiceController Installer Com

  • 使用PowerShell操作Windows服务的命令小结

    PowerShell在处理Windows服务方面,提供了强大的功能,很多方便.强大的cmdlet等着你去光顾. Get-Service,别名gsv,获取服务对象. 举例:gsv eventlog 或 $evtlog = gsv eventlog Start-Service,启动服务. Stop-Service,停止服务. Restart-Service,重启服务. Suspend-Service,挂起/暂停服务. Resume-Service,继续服务. Set-Service,设置服务的属性.

  • .NET实现可交互的WINDOWS服务的实例代码

    这几天想做个文件监控服务,看了一下网上的关于WINDOWS服务的文章,数量都不少,都只讲了如何做一个最基本的服务,却没有讲述如何与用户进行交互.查看了MSDN,看一下关于服务的描述: Windows 服务应用程序在不同于登录用户的交互区域的窗口区域中运行.窗口区域是包含剪贴板.一组全局原子和一组桌面对象的安全对象.由于 Windows 服务的区域不是交互区域,因此 Windows 服务应用程序中引发的对话框将是不可见的,并且可能导致程序停止响应.同样,错误信息应记录在 Windows 事件日志中

  • C#版Windows服务安装卸载小工具

    前言  在我们的工作中,经常遇到Windows服务的安装和卸载,在之前公司也普写过一个WinForm程序选择安装路径,这次再来个小巧灵活的控制台程序,不用再选择,只需放到需要安装服务的目录中运行就可以实现安装或卸载. 开发思路 1.由于系统的权限限制,在运行程序时需要以管理员身份运行 2.因为需要实现安装和卸载两个功能,在程序运行时提示本次操作是安装还是卸载  需要输入 1 或 2  3.接下来程序会查找当前目录中的可执行文件并过滤程序本身和有时我们复制进来的带有vhost的文件,并列出列表让操

  • C#基于Windows服务的聊天程序(1)

    本文将演示怎么通过C#开发部署一个Windows服务,该服务提供各客户端的信息通讯,适用于局域网.采用TCP协议,单一服务器连接模式为一对多:多台服务器的情况下,当客户端连接数超过预设值时可自动进行负载转移,当然也可手动切换服务器,这种场景在实际项目中应用广泛. 简单的消息则通过服务器转发,文件类的消息则让客户端自己建立连接进行传输.后续功能将慢慢完善. 自定义协议: 1.新建Windows服务项目 2.修改配置文件添加 <appSettings> <add key="maxQ

  • C#添加Windows服务 定时任务

    本文实例为大家分享了C#添加Windows服务的具体方法,供大家参考,具体内容如下 源码下载地址:http://xiazai.jb51.net/201701/yuanma/Windowsservice1(jb51.net).rar 步骤一.创建服务项目. 步骤二.添加安装程序. 步骤三.服务属性设置 [serviceInstaller1]. 4.1 添加定时任务 public partial class SapSyn : ServiceBase { System.Timers.Timer tim

随机推荐