# C# .NET控制台程序集成windows service

在控制台程序中集成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)
  {
    //运行你的程序代码
  }
}