为什么在服务启动时调用Main()方法?

时间:2017-03-28 10:21:50

标签: c# service windows-services

我有一个主类的应用程序它覆盖ServiceBase方法并具有Main()静态方法。 我想在命令行调用时使用Main()方法,在从Windows服务管理调用它时使用OnStart()/ OnStop()。

我使用installutils成功安装了这个应用程序作为服务但是当我启动它时,按预期调用Main()方法而不是OnStart()。

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net;
using System.Text;
using System.Threading.Tasks;
using System.Timers;
using System.Xml.Serialization;
using System.Runtime.Serialization.Json;
using System.Threading;
using System.ServiceProcess;
using System.Configuration.Install;
using System.Reflection;

namespace Test
{

    class Program : ServiceBase
    {

        static void Main(string[] args)
        {  
            log.Error("Run as App");
        }


        protected override void OnStart(string[] args)
        {
            log.Info("Starting service");
        }

        protected override void OnStop()
        {
            log.Info("Stopping service");
        }
    }


}

3 个答案:

答案 0 :(得分:9)

Windows服务有一个愧疚的秘密。他们以普通的旧控制台应用程序开始他们的生只有在他们开始运行并向服务控制经理注册后,他们才会转变为服务。

因此,是的,s = """<?xml ... </CARLIST>""" parsed = xmltodict.parse(s) for car in parsed['CARLIST']['CAR']: print(dict(car)) {u'SPECIFICATIONS': OrderedDict([(u'ENGINE', u'TURBO'), (u'FUELTYPE', u'PETROL')]), u'MODEL': u'BENZ'} {u'SPECIFICATIONS': OrderedDict([(u'ENGINE', u'DIESEL'), (u'FUELTYPE', u'PETROL')]), u'MODEL': u'FIAT'} 是第一个被调用的入口点是正确的,因为在那时,它只是一个控制台应用程序。

服务向服务控制管理器注册并成为服务的方式是通过从Main方法(或它调用的方法)调用ServiceBase.Run()来处理的。

答案 1 :(得分:2)

这就是答案:

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net;
using System.Text;
using System.Threading.Tasks;
using System.Timers;
using System.Xml.Serialization;
using System.Runtime.Serialization.Json;
using System.Threading;
using System.ServiceProcess;
using System.Configuration.Install;
using System.Reflection;

namespace Test
{

    class Program : ServiceBase
    {

        static void Main(string[] args)
        {  
                if (System.Environment.UserInteractive)
                {
                    log.Debug("App");
                }
                else
                {
                    ServiceBase.Run(new ServiceBase[] { new Program() });
                }
        }


        protected override void OnStart(string[] args)
        {
            log.Info("Starting service");
        }

        protected override void OnStop()
        {
            log.Info("Stopping service");
        }
    }


}

答案 2 :(得分:1)

Main方法也可以在任何其他程序中的服务中调用。 (见https://msdn.microsoft.com/en-us/library/windows/desktop/ms685477(v=vs.85).aspx)。

您可以使用属性Environment.UserInteractivehttps://msdn.microsoft.com/en-us/library/system.environment.userinteractive.aspx)来确定应用是由用户调用还是作为服务调用。