为什么在服务启动时调用 Main() 方法?
Why Main() method is called on service start?
我的应用程序有一个 main class 它覆盖了 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");
}
}
}
Windows 服务有一个有罪的秘密。他们以普通的旧控制台应用程序开始他们的生活。只有在他们启动 运行 并向服务控制管理器注册后,他们才会转换为服务。
因此,是的,Main
是第一个被调用的入口点是正确的,因为此时它只是一个控制台应用程序。
服务向服务控制管理器注册并成为服务的方式是通过从您的 Main
方法(或它调用的方法)调用 ServiceBase.Run()
来处理的
Main 方法也像在任何其他程序中一样在服务中被调用。 (参见 https://msdn.microsoft.com/en-us/library/windows/desktop/ms685477(v=vs.85).aspx)。
您可以使用 属性 Environment.UserInteractive
(https://msdn.microsoft.com/en-us/library/system.environment.userinteractive.aspx) 来确定应用是由用户调用的还是作为服务调用的。
这是答案:
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");
}
}
}
我的应用程序有一个 main class 它覆盖了 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");
}
}
}
Windows 服务有一个有罪的秘密。他们以普通的旧控制台应用程序开始他们的生活。只有在他们启动 运行 并向服务控制管理器注册后,他们才会转换为服务。
因此,是的,Main
是第一个被调用的入口点是正确的,因为此时它只是一个控制台应用程序。
服务向服务控制管理器注册并成为服务的方式是通过从您的 Main
方法(或它调用的方法)调用 ServiceBase.Run()
Main 方法也像在任何其他程序中一样在服务中被调用。 (参见 https://msdn.microsoft.com/en-us/library/windows/desktop/ms685477(v=vs.85).aspx)。
您可以使用 属性 Environment.UserInteractive
(https://msdn.microsoft.com/en-us/library/system.environment.userinteractive.aspx) 来确定应用是由用户调用的还是作为服务调用的。
这是答案:
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");
}
}
}