.NET控制台应用程序作为Windows服务

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

也许有人可以建议可以快速简单地将c#控制台应用程序转换为服务的类库或代码片段?


我通常使用以下技术来运行与控制台应用程序或服务相同的应用程序:

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通常为true,对于服务则为false。 从技术上讲,可以在用户交互模式下运行服务,以便您可以检查命令行开关。


TopShelf取得了巨大的成功。

TopShelf是一个Nuget包,旨在使创建可以作为控制台应用程序或Windows服务运行的.NET Windows应用程序变得轻松。 您可以快速挂接事件,如服务启动和停止事件,使用代码进行配置,例如设置其运行的帐户,配置其他服务的依赖关系以及配置其从错误中恢复的方式。

从软件包管理器控制台(Nuget):

安装包顶部框架

请参阅代码示例以开始使用。

例:

HostFactory.Run(x =>                                 
{
    x.Service<TownCrier>(s =>                        
    {
       s.ConstructUsing(name=> new TownCrier());     
       s.WhenStarted(tc => tc.Start());              
       s.WhenStopped(tc => tc.Stop());               
    });
    x.RunAsLocalSystem();                            

    x.SetDescription("Sample Topshelf Host");        
    x.SetDisplayName("Stuff");                       
    x.SetServiceName("stuff");                       
}); 

TopShelf还负责服务安装,这可以节省大量时间并从解决方案中删除样板代码。 要将.exe作为服务安装,只需在命令提示符下执行以下命令:

myservice.exe install -servicename "MyService" -displayname "My Service" -description "This is my service."

你不需要连接一个ServiceInstaller和所有的东西 - TopShelf为你做的一切。


所以这里是完整的演练:

  • 创建新的控制台应用程序项目(例如MyService)
  • 添加两个库引用:System.ServiceProcess和System.Configuration.Install
  • 添加下面打印的三个文件
  • 生成项目并运行“InstallUtil.exe c: path to MyService.exe”
  • 现在你应该在服务列表上看到MyService(运行services.msc)
  • * InstallUtil.exe通常可以在这里找到:C: windows Microsoft.NET Framework v4.0.30319 InstallUtil.ex e

    Program.cs中

    using System;
    using System.IO;
    using System.ServiceProcess;
    
    namespace MyService
    {
        class Program
        {
            public const string ServiceName = "MyService";
    
            static void Main(string[] args)
            {
                if (Environment.UserInteractive)
                {
                    // running as console app
                    Start(args);
    
                    Console.WriteLine("Press any key to stop...");
                    Console.ReadKey(true);
    
                    Stop();
                }
                else
                {
                    // running as service
                    using (var service = new Service())
                    {
                        ServiceBase.Run(service);
                    }
                }
            }
    
            public static void Start(string[] args)
            {
                File.AppendAllText(@"c:tempMyService.txt", String.Format("{0} started{1}", DateTime.Now, Environment.NewLine));
            }
    
            public static void Stop()
            {
                File.AppendAllText(@"c:tempMyService.txt", String.Format("{0} stopped{1}", DateTime.Now, Environment.NewLine));
            }
        }
    }
    

    MyService.cs

    using System.ServiceProcess;
    
    namespace MyService
    {
        class Service : ServiceBase
        {
            public Service()
            {
                ServiceName = Program.ServiceName;
            }
    
            protected override void OnStart(string[] args)
            {
                Program.Start(args);
            }
    
            protected override void OnStop()
            {
                Program.Stop();
            }
        }
    }
    

    MyServiceInstaller.cs

    using System.ComponentModel;
    using System.Configuration.Install;
    using System.ServiceProcess;
    
    namespace MyService
    {
        [RunInstaller(true)]
        public class MyServiceInstaller : Installer
        {
            public MyServiceInstaller()
            {
                var spi = new ServiceProcessInstaller();
                var si = new ServiceInstaller();
    
                spi.Account = ServiceAccount.LocalSystem;
                spi.Username = null;
                spi.Password = null;
    
                si.DisplayName = Program.ServiceName;
                si.ServiceName = Program.ServiceName;
                si.StartType = ServiceStartMode.Automatic;
    
                Installers.Add(spi);
                Installers.Add(si);
            }
        }
    }
    
    链接地址: http://www.djcxy.com/p/51159.html

    上一篇: .NET console application as Windows service

    下一篇: Run single instance of an application using Mutex