介绍:
Topshelf是一个开源的跨平台的宿主服务框架,支持Windows和Mono,只需要几行代码就可以构建一个很方便使用的服务宿主。
官网:http://topshelf-project.com
GitHub:http://github.com/topshelf/Topshelf
项目测试:
创建项目
新建一个控制台程序
-
添加引用
通过nuget包管理器搜索TopShelf,安装:
-
创建服务
先创建一个类如MyService
,继承ServiceControl
,然后实现:
可以看到Start
方法和Stop
方法。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Topshelf;
namespace app1
{
public class MyService:ServiceControl
{
public bool Start(HostControl hostControl)
{
throw new NotImplementedException();
}
public bool Stop(HostControl hostControl)
{
throw new NotImplementedException();
}
}
}
在方法中实现要在服务程序中实现的功能代码。
using System;
using System.Timers;
using Topshelf;
namespace app1
{
public class MyService:ServiceControl
{
readonly Timer _timer;
public MyService()
{
_timer = new Timer(1000) { AutoReset = true };
_timer.Elapsed += (sender, eventArgs) => Console.WriteLine("It is time of {0}.", DateTime.Now);
}
public bool Start(HostControl hostControl)
{
_timer.Start();
return true;
}
public bool Stop(HostControl hostControl)
{
_timer.Stop();
return true;
}
}
}
- 调用
在Main中调用
using Topshelf;
namespace app1
{
class Program
{
static void Main(string[] args)
{
HostFactory.Run(x =>
{
x.Service<MyService>();
//以local system模式运行
x.RunAsLocalSystem();
/*
//启动类型设置
x.StartAutomatically();//自动
x.StartAutomaticallyDelayed();// 自动(延迟启动)
x.StartManually();//手动
x.Disabled();//禁用
*/
//常规信息
x.SetDescription("服务的描述信息"); //MyService服务的描述信息
x.SetDisplayName("服务的显示名称"); //MyService服务的显示名称
x.SetServiceName("服务名称"); //MyService服务名称
});
}
}
}
-
服务设置完成后,可以直接双击以控制台的形式运行。
-
安装服务
安装:程序文件名.exe install
启动:程序文件名.exe start
停止:程序文件名.exe stop
卸载:程序文件名.exe uninstall更多命令:程序文件名.exe help
跨平台(未验证)
Topshelf是一个开源的跨平台的宿主服务框架,不过本身只支持mono 命令行执行,不能使用Topshelf的命令行Start,Stop控制服务。
将程序上传到linux 系统执行。 执行:
mono 程序文件名.exe
注意:topshelf 对linux的支持需要加一个扩展包https://www.nuget.org/packages/Topshelf.Linux/,然后Mono 最好用最新的4.2 版本。