Topshelf是创建Windows处事的另一种要领,老外的一篇文章Create a .NET Windows Service in 5 steps with Topshelf通过5个法式详细的介绍使用使用Topshelf创建Windows 处事。Topshelf是一个开源的跨平台的宿主处事框架,撑持Windows和Mono,只需要几行代码就可以构建一个很便利使用的处事宿主。
引用安置1、官网: 这里面有详细的文档及下载
2、Topshelf的代码托管在 ,可以在这里下载到最新的代码。
3、新建一个项目,只需要引用Topshelf.dll 即可,为了日志输出显示,建议也同时引用Topshelf.Log4Net。措施安置命令
Install-Package Topshelf
Install-Package Topshelf.Log4Net
使用官网文档给过来的例子非常简单,直接使用即可以跑起来,官网文档地点:
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()); //3 s.WhenStarted(tc => tc.Start()); //4 s.WhenStopped(tc => tc.Stop()); //5 }); x.RunAsLocalSystem(); //6 x.SetDescription("Sample Topshelf Host"); //7 x.SetDisplayName("Stuff"); //8 x.SetServiceName("Stuff"); //9 }); //10 } }
措施跑起来后,每隔一秒钟有输出,看到的效果如下:
配置运行没错,整个措施已经开发完了,接下来,只需要简单配置一下,即可以当处事来使用了。安置很便利:
安置:TopshelfDemo.exe install
启动:TopshelfDemo.exe start
卸载:TopshelfDemo.exe uninstall
安置告成后,接下来,我们就可以看随处事里多了一个处事:
扩展说明 Topshelf Configuration 简单配置官方文档,对HostFactory 里面的参数做了详细的说明: ,下面只对一些常用的要领进行简单的解释:
我们将上面的措施代码改一下:
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()); //4 s.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处事名称"); }); } } } 二、常用模式。
实例: