AY:写C# 可以新建window service项目,但是不方便调试,于是,我们可以用控制台去开发,然后自己移植代码到服务去,开发和部署 window服务,其实
topshelf更方便,接下来我们来学习。
新建控制台项目 AyNotice服务
====================www.ayjs.net 杨洋 wpfui.com ayui ay aaronyang=======请不要转载谢谢了。=========
1、官网:http://topshelf-project.com/ 这里面有详细的文档及下载
2、Topshelf的代码托管在 http://github.com/topshelf/Topshelf/downloads ,可以在这里下载到最新的代码。
我用的3.0.2的,作者貌似2012年更新的。
控制台引用Topshelf.dll和 Topshelf.NLog.dll
放入代码
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Timers; using Topshelf; namespace AyNotice { public class AyNoticeTimer { readonly Timer _timer; public AyNoticeTimer() { _timer = new Timer(1000) { AutoReset = true }; _timer.Elapsed += (sender, eventArgs) => Console.WriteLine("AY: 现在 {0} ", DateTime.Now); } public void Start() { _timer.Start(); } public void Stop() { _timer.Stop(); } } class Program { static void Main(string[] args) { HostFactory.Run(x => //1 { x.Service<AyNoticeTimer>(s => //2 { s.ConstructUsing(name => new AyNoticeTimer()); //3 s.WhenStarted(tc => tc.Start()); //4 s.WhenStopped(tc => tc.Stop()); //5 }); x.RunAsLocalSystem(); //6 x.SetDescription("AY第一个TopShelf宿主"); //7 x.SetDisplayName("AyNotice"); //8 x.SetServiceName("AyNotice"); //9 }); } } }
F5跑起来
接下来,只需要简单配置一下,即可以当服务来使用了。安装很方便:
安装 G:\正在研究整合\AyNotice\AyNotice\bin\Debug\AyNotice.exe install
提示,你必须 管理员方式的cmd 执行,我管理员 powershell一样的。
cmd输入services.msc回车,打开服务窗口查看。这样一个控制台就变成服务了。
启动 G:\正在研究整合\AyNotice\AyNotice\bin\Debug\AyNotice.exe start
卸载 G:\正在研究整合\AyNotice\AyNotice\bin\Debug\AyNotice.exe uninstall
官方文档 ,对HostFactory 里面的参数做了详细的说明: ,下面只对一些常用的方法进行简单的解释:
两种使用模式
1 简单模式。继承ServiceControl接口,实现该接口即可。
下载并引用了 2.0.8的log4net
我去掉了TopShelf.Nlog那个dll了,换成
新建log的配置: Log4Net.xml
<?xml version="1.0" encoding="utf-8" ?> <configuration> <log4net> <root> <level value="WARN" /> <appender-ref ref="LogFileAppender" /> <appender-ref ref="ConsoleAppender" /> </root> <logger name="testApp.Logging"> <level value="DEBUG"/> </logger> <appender name="LogFileAppender" type="log4net.Appender.FileAppender" > <param name="File" value="log-file.txt" /> <param name="AppendToFile" value="true" /> <layout type="log4net.Layout.PatternLayout"> <param name="Header" value="[Header] "/> <param name="Footer" value="[Footer] "/> <param name="ConversionPattern" value="%d [%t] %-5p %c [%x] - %m%n" /> </layout> <filter type="log4net.Filter.LevelRangeFilter"> <param name="LevelMin" value="DEBUG" /> <param name="LevelMax" value="WARN" /> </filter> </appender> <appender name="ConsoleAppender" type="log4net.Appender.ConsoleAppender" > <layout type="log4net.Layout.PatternLayout"> <param name="ConversionPattern" value="%d [%t] %-5p %c [%x] - %m%n" /> </layout> </appender> </log4net> </configuration>
修改客户端代码:
public class AyNoticeTimer : ServiceControl { private Timer _timer = null; readonly ILog _log = log4net.LogManager.GetLogger("testApp.Logging");//获取一个日志记录器 //readonly ILog _log = LogManager.GetLogger(typeof(AyNoticeTimer)); public AyNoticeTimer() { _timer = new Timer(1000) { AutoReset = true }; _timer.Elapsed += (sender, eventArgs) => { _log.Info(DateTime.Now); }; } public bool Start(HostControl hostControl) { _log.Info("Topshelf Demo 运行中..."); _timer.Start(); return true; } public bool Stop(HostControl hostControl) { _log.Info("Topshelf Demo 结束"); _timer.Stop(); return true; } } class Program { public static void Main(string[] args) { var logCfg = new FileInfo(AppDomain.CurrentDomain.BaseDirectory + "Log4Net.xml"); XmlConfigurator.ConfigureAndWatch(logCfg); HostFactory.Run(x => { x.Service<AyNoticeTimer>(); x.RunAsLocalSystem(); x.SetDescription("AY第一个TopShelf宿主"); //7 /安装服务后,服务的描述 x.SetDisplayName("AyNotice"); //8 显示名称 x.SetServiceName("AyNotice"); //9 服务名称 }); } }
F5运行后,会生成日志文件,说明代码对的,当然,也可以注册为服务。
第二种方式
Custom Service 就是我们一开始写的那种写法,不继承
我更换了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= "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".log""/> <!--日志根据日期滚动--> <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>
修改第一次写的代码
public class AyNoticeTimer { readonly Timer _timer; readonly ILog _log = LogManager.GetLogger( typeof(AyNoticeTimer)); public AyNoticeTimer() { _timer = new Timer(1000) { AutoReset = true }; _timer.Elapsed += (sender, eventArgs) => _log.Info("AY: 现在 "+DateTime.Now) ; } public void Start() { _timer.Start(); } public void Stop() { _timer.Stop(); } } class Program { static void Main(string[] args) { var logCfg = new FileInfo(AppDomain.CurrentDomain.BaseDirectory + "Log4Net.xml"); XmlConfigurator.ConfigureAndWatch(logCfg); HostFactory.Run(x => //1 { x.Service<AyNoticeTimer>(s => //2 配置一个完全定制的服务,对Topshelf没有依赖关系。常用的方式。 { s.ConstructUsing(name => new AyNoticeTimer()); //3 s.WhenStarted(tc => tc.Start()); //4 s.WhenStopped(tc => tc.Stop()); //5 }); x.RunAsLocalSystem(); //6 服务使用NETWORK_SERVICE内置帐户运行。身份标识,有好几种方式, // 如:x.RunAs("username", "password"); x.RunAsPrompt(); x.RunAsNetworkService(); 等 x.SetDescription("AY第一个TopShelf宿主"); //7 /安装服务后,服务的描述 x.SetDisplayName("AyNotice"); //8 显示名称 x.SetServiceName("AyNotice"); //9 服务名称 }); } }
有了这个东西,控制台也可以变成服务了,比以前windowservice好多了。
====================www.ayjs.net 杨洋 wpfui.com ayui ay aaronyang=======请不要转载谢谢了。=========
推荐您阅读更多有关于“”的文章
注:本文内容来自互联网,旨在为开发者提供分享、交流的平台。如有涉及文章版权等事宜,请你联系站长进行处理。