这篇文章介绍了使用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服务的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持得得之家。
本文标题为:使用Topshelf框架操作Windows服务
基础教程推荐
- C# windows语音识别与朗读实例 2023-04-27
- C# List实现行转列的通用方案 2022-11-02
- winform把Office转成PDF文件 2023-06-14
- ZooKeeper的安装及部署教程 2023-01-22
- unity实现动态排行榜 2023-04-27
- 一个读写csv文件的C#类 2022-11-06
- C# 调用WebService的方法 2023-03-09
- linux – 如何在Debian Jessie中安装dotnet core sdk 2023-09-26
- C#类和结构详解 2023-05-30
- C#控制台实现飞行棋小游戏 2023-04-22