1、创建项目
2、使用nuget安装Topshelf和Topshelf.Log4Net(记录日志)
3、创建MyService
using System;
using System.Timers;
using log4net;
namespace TopshelfDemo
{
public class MyService
{
readonly Timer _timer;
readonly ILog _log = LogManager.GetLogger(typeof(MyService));
public MyService()
{
_timer = new Timer(1000) { AutoReset = true };
_timer.Elapsed += new ElapsedEventHandler(OnTick);
_timer.Elapsed += (sender, eventArgs) => Console.WriteLine("It is {0} and all is well", DateTime.Now);
}
protected virtual void OnTick(object sender, ElapsedEventArgs e)
{
_log.Debug("Tick:" + DateTime.Now.ToLongTimeString());
}
public void Start()
{
_log.Info("Service is Started");
_timer.Start();
}
public void Stop()
{
_log.Info("Service is Stopped");
_timer.Stop();
}
}
}
4、定义InitWindowsService方法并在Main方法中调用
using log4net.Config;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Topshelf;
namespace TopshelfDemo
{
class Program
{
static void Main(string[] args)
{
InitWindowsService();
}
/// <summary>
/// 初始化windows服务
/// </summary>
private static void InitWindowsService()
{
FileInfo fi = new FileInfo(AppDomain.CurrentDomain.BaseDirectory + "log4net.config");
XmlConfigurator.ConfigureAndWatch(fi);
HostFactory.Run(x =>
{
x.Service<MyService>(sc =>
{
sc.ConstructUsing(name => new MyService());
sc.WhenStarted(tc => tc.Start());
sc.WhenStopped(tc => tc.Stop());
});
x.RunAsLocalSystem();
x.SetDescription("Sample Topshelf Host");
x.SetDisplayName("TopshelfDemo");
x.SetServiceName("TopshelfDemo");
x.UseLog4Net();
});
}
}
}
5、编译整个项目,使用命令行注册服务