概述
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 TopshelfInstall-Package Topshelf.Log4Net使用
官网文档给过来的例子非常简单,直接使用即可以跑起来,官网文档地址:http://docs.topshelf-project.com/en/latest/configuration/quickstart.html
publicclassTownCrier{ readonlyTimer _timer; publicTownCrier() { _timer = newTimer(1000) {AutoReset = true}; _timer.Elapsed += (sender, eventArgs) => Console.WriteLine("It is {0} and all is well", DateTime.Now); } publicvoidStart() { _timer.Start(); } publicvoidStop() { _timer.Stop(); }}publicclassProgram{ publicstaticvoidMain() { HostFactory.Run(x => //1{ x.Service
(s => //2{ s.ConstructUsing(name=> newTownCrier()); //3s.WhenStarted(tc => tc.Start()); //4s.WhenStopped(tc => tc.Stop()); //5}); x.RunAsLocalSystem(); //6x.SetDeion("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
(s => //2{ s.ConstructUsing(name => newTownCrier()); //配置一个完全定制的服务,对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.SetDeion("Sample Topshelf Host服务的描述"); //安装服务后,服务的描述x.SetDisplayName("Stuff显示名称"); //显示名称x.SetServiceName("Stuff服务名称"); //服务名称});
重装安装运行后:
通过上面,相信大家都很清楚 SetDeion、SetDisplayName、SetServiceName区别。不再细说。
Service Configuration 服务配置
Topself的服务一般有主要有两种使用模式。
一、简单模式。继承ServiceControl接口,实现该接口即可。
实例:
namespaceTopshelfDemo{publicclassTownCrier : ServiceControl {privateTimer _timer = null;readonlyILog _log = LogManager.GetLogger(typeof(TownCrier));publicTownCrier() { _timer= newTimer(1000) { AutoReset = true}; _timer.Elapsed+= (sender, eventArgs) =>_log.Info(DateTime.Now); }publicboolStart(HostControl hostControl) { _log.Info("TopshelfDemo is Started"); _timer.Start();returntrue; }publicboolStop(HostControl hostControl) {thrownewNotImplementedException(); } }classProgram {publicstaticvoidMain(string[] args) {varlogCfg = newFileInfo(AppDomain.CurrentDomain.BaseDirectory + "log4net.config"); XmlConfigurator.ConfigureAndWatch(logCfg); HostFactory.Run(x=>{ x.Service
(); x.RunAsLocalSystem(); x.SetDeion("Sample Topshelf Host服务的描述"); x.SetDisplayName("Stuff显示名称"); x.SetServiceName("Stuff服务名称"); }); } }}二、常用模式。
实例:
namespaceTopshelfDemo{ publicclassTownCrier { privateTimer _timer = null; readonlyILog _log =LogManager.GetLogger( typeof(TownCrier)); publicTownCrier() { _timer = newTimer(1000) { AutoReset = true}; _timer.Elapsed += (sender, eventArgs) =>_log.Info(DateTime.Now); } publicvoidStart(){ _timer.Start();} publicvoidStop() { _timer.Stop(); } } classProgram { publicstaticvoidMain(string[] args) { varlogCfg = newFileInfo(AppDomain.CurrentDomain.BaseDirectory + "log4net.config"); XmlConfigurator.ConfigureAndWatch(logCfg); HostFactory.Run(x =>{ x.Service
(s =>{ s.ConstructUsing(name => newTownCrier()); s.WhenStarted(tc =>tc.Start()); s.WhenStopped(tc =>tc.Stop()); }); x.RunAsLocalSystem(); x.SetDeion("Sample Topshelf Host服务的描述"); x.SetDisplayName("Stuff显示名称"); x.SetServiceName("Stuff服务名称"); }); } }}
两种方式,都使用了Log4Net,相关配置:
FATAL > ERROR > WARN > INFO > DEBUG > ALL (低) -->
推荐使用第二种常用模式。
留言与评论(共有 0 条评论) |