在控制台程序中集成windows service,使得程序既可以直接运行也可以通过sc命令注册为windows 服务运行
1、创建服务类
使用nuget安装System.ServiceProcess.ServiceController库,然后在项目中,添加一个Windows 服务类,
C#
partial class Service : ServiceBase
{
public Service()
{
InitializeComponent();
}
protected override void OnStart(string[] args)
{
//运行你的代码
Program.Run(args);
// TODO: 在此处添加代码以启动服务。
}
protected override void OnStop()
{
// TODO: 在此处添加代码以执行停止服务所需的关闭操作。
}
}
2、在程序入口改一下
C#
internal class Program
{
static async Task Main(string[] args)
{
if (Environment.UserInteractive == false && OperatingSystem.IsWindows())
{
//设置程序文件夹
string serviceDirectory = Path.GetDirectoryName(Process.GetCurrentProcess().MainModule.FileName);
Directory.SetCurrentDirectory(serviceDirectory);
ServiceBase[] ServicesToRun;
ServicesToRun = new ServiceBase[]
{
new Service()
};
//运行服务,由服务去运行你的代码
ServiceBase.Run(ServicesToRun);
}
else
{
//直接俄运行你的代码
Run(args);
//等待程序结束,让程序在linux可以自托管
await Await().ConfigureAwait(false);
}
}
public static async Task Await()
{
CancellationTokenSource cancellationTokenSource = new CancellationTokenSource();
AppDomain.CurrentDomain.ProcessExit += (sender, e) => cancellationTokenSource.Cancel();
Console.CancelKeyPress += (sender, e) => cancellationTokenSource.Cancel();
await Task.Delay(-1, cancellationTokenSource.Token).ConfigureAwait(false);
}
public static void Run(string[] args)
{
//运行你的程序代码
}
}