我有控制台应用程序,并希望将其作为Windows服务运行。VS2010具有项目模板,该模板允许连接控制台项目并构建Windows服务。我希望不添加分离的服务项目,如果可能的话,将服务代码集成到控制台应用程序中,以将控制台应用程序作为一个项目,该项目可以作为控制台应用程序或Windows服务运行,如果使用交换机从命令行中运行。

也许有人可以建议班级库或代码段,可以快速,轻松地将C#控制台应用程序转换为服务?

答案

我通常使用以下技术将同一应用程序作为控制台应用程序或服务运行:

using System.ServiceProcess

public static class Program
{
    #region Nested classes to support running as service
    public const string ServiceName = "MyService";

    public class Service : ServiceBase
    {
        public Service()
        {
            ServiceName = Program.ServiceName;
        }

        protected override void OnStart(string[] args)
        {
            Program.Start(args);
        }

        protected override void OnStop()
        {
            Program.Stop();
        }
    }
    #endregion
    
    static void Main(string[] args)
    {
        if (!Environment.UserInteractive)
            // running as service
            using (var service = new Service())
                ServiceBase.Run(service);
        else
        {
            // running as console app
            Start(args);

            Console.WriteLine("Press any key to stop...");
            Console.ReadKey(true);

            Stop();
        }
    }
    
    private static void Start(string[] args)
    {
        // onstart code here
    }

    private static void Stop()
    {
        // onstop code here
    }
}

Environment.UserInteractive控制台应用程序通常是正确的,而对于服务来说是false。从技术上讲,可以在用户交互模式下运行服务,因此您可以检查命令行开关。

来自: stackoverflow.com