使用Topshelf框架操作Windows服务

 更新时间:2022年06月13日 08:52:44   作者:springsnow  
这篇文章介绍了使用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 服务下找到并启动它。

image

注意:因为 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服务的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • C#实现自定义双击事件

    C#实现自定义双击事件

    这篇文章主要介绍了C#实现自定义双击事件,需要的朋友可以参考下
    2014-08-08
  • C# 二进制数组与结构体的互转方法

    C# 二进制数组与结构体的互转方法

    本文将和大家介绍 MemoryMarshal 辅助类,通过这个辅助类用来实现结构体数组和二进制数组的相互转换,对C# 二进制数组与结构体的互转方法感兴趣的朋友一起看看吧
    2023-09-09
  • C#简单嵌套flash读取数据的实现代码

    C#简单嵌套flash读取数据的实现代码

    这篇文章主要介绍了C#简单嵌套flash读取数据的实现代码,有需要的朋友可以参考一下
    2013-11-11
  • C#中LINQ多条件JOIN时为什么可以使用匿名类

    C#中LINQ多条件JOIN时为什么可以使用匿名类

    这篇文章主要给大家介绍了关于C#中LINQ多条件JOIN时为什么可以使用匿名类的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考借鉴,下面来一起看看吧
    2018-09-09
  • C#实现鼠标拖拽无边框浮动窗体的方法

    C#实现鼠标拖拽无边框浮动窗体的方法

    一般情况下,在标题栏中按住鼠标左键不放即可实现拖动操作,当做浮动窗体时,如果包含窗体边框,那么界面给使用者的感觉将很不友好,因此本文给大家介绍了C#实现鼠标拖拽无边框浮动窗体的方法,感兴趣的朋友可以参考下
    2024-04-04
  • C#实现简单的计算器小程序

    C#实现简单的计算器小程序

    这篇文章主要为大家详细介绍了C#实现简单的计算器小程序,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-01-01
  • C#异常处理知识汇总

    C#异常处理知识汇总

    这篇文章主要介绍了C#异常处理的知识,文中讲解非常详细,配合代码帮助大家更好的理解,感兴趣的朋友可以参考下
    2020-06-06
  • C#中async await异步关键字用法和异步的底层原理全解析

    C#中async await异步关键字用法和异步的底层原理全解析

    这篇文章主要介绍了C#中async await异步关键字用法和异步的底层原理全解析,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2025-04-04
  • C#格式化json字符串的方法分析

    C#格式化json字符串的方法分析

    这篇文章主要介绍了C#格式化json字符串的方法,结合实例形式分析了C#针对json字符串格式化的原理、步骤与具体实现技巧,需要的朋友可以参考下
    2017-06-06
  • 详解Unity地面检测方案

    详解Unity地面检测方案

    本文主要介绍了Unity地面检测方案,感兴趣的同学,可以参考下,并且亲自实验一下。
    2021-05-05

最新评论