使用Topshelf创建Windows服务

article/2025/10/21 14:44:10

概述

Topshelf是创建Windows服务的另一种方法,老外的一篇文章Create a .NET Windows Service in 5 steps with Topshelf通过5个步骤详细的介绍使用使用Topshelf创建Windows 服务。Topshelf是一个开源的跨平台的宿主服务框架,支持Windows和Mono,只需要几行代码就可以构建一个很方便使用的服务宿主。

引用安装

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

2、Topshelf的代码托管在 http://github.com/topshelf/Topshelf/downloads   ,可以在这里下载到最新的代码。

3、新建一个项目,只需要引用Topshelf.dll 即可,为了日志输出显示,建议也同时引用Topshelf.Log4Net。程序安装命令

  • Install-Package Topshelf
  • Install-Package Topshelf.Log4Net

使用

官网文档给过来的例子非常简单,直接使用即可以跑起来,官网文档地址:http://docs.topshelf-project.com/en/latest/configuration/quickstart.html

public class TownCrier
{readonly Timer _timer;public TownCrier(){_timer = new Timer(1000) {AutoReset = true};_timer.Elapsed += (sender, eventArgs) => Console.WriteLine("It is {0} and all is well", DateTime.Now);}public void Start() { _timer.Start(); }public void Stop() { _timer.Stop(); }
}public class Program
{public static void Main(){HostFactory.Run(x =>                                 //1
        {x.Service<TownCrier>(s =>                        //2
            {s.ConstructUsing(name=> new TownCrier());     //3s.WhenStarted(tc => tc.Start());              //4s.WhenStopped(tc => tc.Stop());               //5
            });x.RunAsLocalSystem();                            //6
x.SetDescription("Sample Topshelf Host");        //7x.SetDisplayName("Stuff");                       //8x.SetServiceName("Stuff");                       //9});                                                  //10
    }
}

程序跑起来后,每隔一秒钟有输出,看到的效果如下:

配置运行

没错,整个程序已经开发完了,接下来,只需要简单配置一下,即可以当服务来使用了。安装很方便:

安装:TopshelfDemo.exe install
启动:TopshelfDemo.exe start
卸载:TopshelfDemo.exe uninstall

安装成功后,接下来,我们就可以看到服务里多了一个服务:

扩展说明

Topshelf Configuration 简单配置

官方文档,对HostFactory 里面的参数做了详细的说明:http://docs.topshelf-project.com/en/latest/configuration/config_api.html ,下面只对一些常用的方法进行简单的解释:

我们将上面的程序代码改一下:

            HostFactory.Run(x =>                                 //1
            {x.Service<TownCrier>(s =>                        //2
                {s.ConstructUsing(name => new TownCrier());     //配置一个完全定制的服务,对Topshelf没有依赖关系。常用的方式。
            //the start and stop methods for the service
                    s.WhenStarted(tc => tc.Start()); //4s.WhenStopped(tc => tc.Stop()); //5 });x.RunAsLocalSystem(); // 服务使用NETWORK_SERVICE内置帐户运行。身份标识,有好几种方式,如:x.RunAs("username", "password"); x.RunAsPrompt(); x.RunAsNetworkService(); 等 x.SetDescription("Sample Topshelf Host服务的描述"); //安装服务后,服务的描述x.SetDisplayName("Stuff显示名称"); //显示名称x.SetServiceName("Stuff服务名称"); //服务名称});

重装安装运行后:

 通过上面,相信大家都很清楚 SetDescription、SetDisplayName、SetServiceName区别。不再细说。

Service Configuration 服务配置

Topself的服务一般有主要有两种使用模式。

一、简单模式。继承ServiceControl接口,实现该接口即可。

实例:

namespace TopshelfDemo
{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();}}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服务名称");});}}
}

二、常用模式。

实例:

namespace TopshelfDemo
{public class TownCrier{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 void Start(){ _timer.Start();}public void Stop() { _timer.Stop(); }}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>(s =>{s.ConstructUsing(name => new TownCrier());s.WhenStarted(tc => tc.Start());              s.WhenStopped(tc => tc.Stop());             });x.RunAsLocalSystem();x.SetDescription("Sample Topshelf Host服务的描述");x.SetDisplayName("Stuff显示名称");x.SetServiceName("Stuff服务名称");});}}
}

两种方式,都使用了Log4Net,相关配置:

<?xml version="1.0" encoding="utf-8" ?>
<configuration><configSections><section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/></configSections><log4net><appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender"><!--日志路径--><param name= "File" value= "D:\App_Data\servicelog\"/><!--是否是向文件中追加日志--><param name= "AppendToFile" value= "true"/><!--log保留天数--><param name= "MaxSizeRollBackups" value= "10"/><!--日志文件名是否是固定不变的--><param name= "StaticLogFileName" value= "false"/><!--日志文件名格式为:2008-08-31.log--><param name= "DatePattern" value= "yyyy-MM-dd&quot;.log&quot;"/><!--日志根据日期滚动--><param name= "RollingStyle" value= "Date"/><layout type="log4net.Layout.PatternLayout"><param name="ConversionPattern" value="%d [%t] %-5p %c - %m%n %loggername" /></layout></appender><!-- 控制台前台显示日志 --><appender name="ColoredConsoleAppender" type="log4net.Appender.ColoredConsoleAppender"><mapping><level value="ERROR" /><foreColor value="Red, HighIntensity" /></mapping><mapping><level value="Info" /><foreColor value="Green" /></mapping><layout type="log4net.Layout.PatternLayout"><conversionPattern value="%n%date{HH:mm:ss,fff} [%-5level] %m" /></layout><filter type="log4net.Filter.LevelRangeFilter"><param name="LevelMin" value="Info" /><param name="LevelMax" value="Fatal" /></filter></appender><root><!--(高) OFF > FATAL > ERROR > WARN > INFO > DEBUG > ALL (低) --><level value="all" /><appender-ref ref="ColoredConsoleAppender"/><appender-ref ref="RollingLogFileAppender"/></root></log4net>
</configuration>

 推荐使用第二种常用模式。

源代码下载:http://download.csdn.net/detail/jys1216/8860119

下一篇,将介绍:Topself与Quartz.net的结合使用,结合起来使用,真是一个很完美的后台作业调试服务。

 


http://chatgpt.dhexx.cn/article/eaDFON65.shtml

相关文章

QT编程入门之QT designer

1.qt 编程的工作流程简介 使用QT作为GUI开发工具的项目流程&#xff0c;可用下图表示&#xff1a; QT项目开发流程 开发流程的解析&#xff1a;假设用QDesigner设计了一个X.UI窗口&#xff0c;之后就需要使用uic来进行编译&#xff0c;生成对应的.h文件.另外一个自定义的类型…

Qt入门学习——Qt Creator 中 ui 文件和 Qt 代码关系

通过《Qt Creator的使用》的学习&#xff0c;我们可以借助 Designer&#xff08;界面设计器&#xff09;快速设计界面。 此例子 ui 内容如下&#xff08;只是简单添加了一个按钮&#xff09;&#xff1a; 工程的代码目录结构如下&#xff1a; 最终在工程所在目录会生成一个 ui …

Qt 设计师 - Qt Designer 调整 控件 居中

目录 问题方案 问题 在上面这张图中&#xff0c;有三个垂直布局&#xff0c;但是垂直布局中上层的控件没办法拖到居中的位置。 方案 点击这个控件&#xff0c;右键 这里2是水平居中&#xff0c;下面的是垂直居中&#xff0c;操作三次&#xff0c;好了

使用Qt Designer和Qss设计Qt界面

开发界面其实一点都不比写后台逻辑简单&#xff0c;后台逻辑对需求方来说只有能用和不能用&#xff0c;但是界面没有一个确切的标准说好看还是不好看&#xff0c;所以设计出一个大家都说好的界面真的很难。 我们的业务是服务于内部用户的&#xff0c;其实大家对我们的评价就是…

Qt Designer和Qt Creator区别

不管是Qt新手还是开发过qt的群体来说&#xff0c;对Qt Designer、Qt Quick Designer、Qt Creator这几个应用程序肯定是熟悉的&#xff0c;但是你要是说具体的区别&#xff0c;干啥用的或者是它们实际上是单独的事物还是同一事物的名称&#xff0c;或者还是名称随时间变化了还是…

Qt Designer的简单使用

在前面两节的例子中&#xff0c;主界面窗口的尺寸和标签控件显示的矩形区域等&#xff0c;都是用 C 代码编写的。窗口和控件的尺寸都是预估的&#xff0c;控件如果多起来&#xff0c;那就不好估计每个控件合适的位置和大小了。 用 C 代码编写图形界面的问题就是不直观&#xf…

Qt Design Studio

1 介绍 1.1 概述 1.2 Qt Design Studio的详细特性 QtPhotoshop Bridge 在Photoshop中创建您的UI设计和UI组件&#xff0c;然后把它们导入到Qt Design Studio中。这包含一个先进的Photoshop插件&#xff0c;它能把您的设计翻译成QML语言&#xff0c;并导入到Qt Design Studio…

PyQt5利用Qt designer(QT设计师)使用tab widget和stacked widget实现多页面切换

PyQt5 Qt designer QT设计师 使用tab widget和stacked widget实现多页面切换 一、使用Qt designer(QT设计师)进行多页面切换ui设计二、实现tab widget多页面切换三、实现stacked widget多页面切换四、生成代码五、运行效果 一、使用Qt designer(QT设计师)进行多页面切换ui设计 …

Qt漂亮界面

Qt漂亮界面 功能规划&#xff1a;一、去掉菜单栏和工具栏二、顶部导航栏的设计appinit.h头文件appinit.cpp的文件使用方式&#xff1a; 三、阵列按钮的点击事件写法四、重写缩写界面、放大界面和关闭程序事件五、鼠标事件的处理Qt大量同类控件的操作正则表达式的设计Qt 手把手教…

PyQt5 Qt Designer 新手教程(一)—— 软件界面介绍

PyQt5 Qt Designer 新手教程&#xff08;一&#xff09;—— 软件界面介绍 教程博文 一、前言 终于学到了 PyQt5 Qt 设计师&#xff08;Qt Designer&#xff09;这个软件&#xff0c;博主感觉心情还是很激动的。因为&#xff0c;当初学 PyQt5 &#xff0c;想要设计一个窗体时…

qt界面设计

设计界面时大概可以分三步&#xff1a; 构造出需要的所有控件通过布局管理器确定控件位置通过样式表优化控件样式 1.布局管理器 1. QBoxLayoutQHBoxLayout 水平布局QVBoxLayout 垂直布局1&#xff09;setStretch 设置部件的拉伸系数2&#xff09;setSpacing 设置部…

QTDesigner简介

1、QTDesigner简介&#xff1a; 手写代码工作量大、代码结构容易搞得混乱。 设计工具&#xff1a;直观、高效&#xff0c;工作量小&#xff0c;方便调试。界面和逻辑分离后期好维护。 介绍&#xff1a;&#xff08;实现了视图和逻辑的分离&#xff0c;开发代码更容易分离&…

PyQt5:使用QT设计师设计界面

一. 界面设计 登录预览&#xff1a; 图1.1 设计界面 界面文件 可以在这里下载login.ui文件 资源文件 除了ui文件&#xff0c;有时候需要使用到资源&#xff1a; 图片资源 窗体图标(login.png): .qrc文件 可以在这里下载.qrc文件&#xff0c;文件内容如下&#xff1…

Python PyQt5 Qt Designer (Qt设计师)

PyQt5 Qt Designer (Qt设计师) 本文由 Luzhuo 编写,转发请保留该信息. 原文: https://blog.csdn.net/Rozol/article/details/87705426 PyQt5是对Qt所有类进行封装, Qt能开发的东西, PyQt都能开发. Qt是强大的GUI库之一, 用C开发, 并且跨平台. PyQt双许可证, 要么选择GPL(自由软…

Qt Designer简介

来源 http://www.python3.vip/tut/py/gui/qt_03/ 回顾 在前面的程序中&#xff0c;我们学习了怎么样用程序来把QT程序界面的 一个个窗口、控件创建出来 问题分析 QT程序界面的 一个个窗口、控件&#xff0c;就是像上面那样用相应的代码创建出来的。 但是&#xff0c;把你…

Unity资源打包(AssetBundle)

一、AssetBundle的定义和作用 定义&#xff1a; - 它是一个存在于硬盘上的文件。可以称之为压缩包。这个压缩包可以认为是一个文件夹&#xff0c;里面包含了多个文件。这些文件可以分为两类&#xff1a;serialized file 和 resource files。&#xff08;序列化文件和源文件&a…

游戏开发unity资源管理系列:unity不支持长路径;DirectoryNotFoundException: Could not find a part of the path ““

说明&#xff1a; 使用Addressables打包出现如下报错 DirectoryNotFoundException: Could not find a part of the path "" 打断点发现资源路径与目标路径字符串非空&#xff0c;但是仍然提示报错。Library\com.unity.addressables下ab资源打出&#xff0c;但是仍然报…

Unity资源包共享

unity最全材质球的资源包 unity家具包装设计资源包 unity游戏模型资源包 unity人物模型资源包 unity枪模型资源包 … … … 其中一部分 有需要的朋友下方评论留下邮箱号,我发给你们,文件太大无法上传

Unity资源替换工具,旧模型替换新模型,替换GUID,替换meta文件,文件丢失等问题

Unity资源替换工具,旧模型替换新模型,替换GUID,替换meta文件,文件丢失等问题 使用说明如何使用 使用说明 第一次写,不是很规范,好东西分享给大家,学点编辑器扩展好处多啊! 如何使用 这个小工具确实帮到我了,替我省了不少时间 直接上代码: using UnityEngine; using System.…