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

标签 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");
        }
    }


}

最佳答案

Windows 服务有一个罪恶的 secret 。他们以普通的旧控制台应用程序开始他们的生活。只有在它们开始运行并向服务控制管理器注册后,它们才会转换为服务。

因此,是的,Main 是第一个被调用的入口点是正确的,因为此时它只是一个控制台应用程序。

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

关于c# - 为什么在服务启动时调用 Main() 方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43066969/

相关文章:

c# - .NET Core 3.1 - 无法加载文件或程序集 System.Runtime,版本 = 4.2.2.0

android - Android 中的服务上下文和应用程序上下文之间有区别吗?

c# - 如何在远程服务器上运行命令行程序

delphi - Delphi 中的服务应用程序

c# - 决定将 C# 类设为静态

C# 启动加载页面

java - 将大文件上传到 Amazon S3 时出现问题

android - 使服务生命周期独立于 Activity

linux - 尝试确定如何在命令行模式下在 Wine 上运行 Windows 应用程序

c# - 系统线程: Cross-thread operation not valid