c# - .NET Windows 服务是否需要调用 ServiceBase.Run()

标签 c# .net-3.5 windows-services

我在使用 Windows 服务方面相当陌生,但我发现了一个奇怪的事件,我想得到一些澄清。我有一个用 C# 编写的 Windows 服务,我安装它并使用命令行开始(在 stackoverflow 上找到了很好的说明)。我的服务的主要方法如下所示:

    static void Main(string[] args)
    {
        if (args.Length == 0)
        {
            ServiceBase.Run(new MyServiceName());
        }
        else if (args.Length == 1)
        {
            const string name = "MyServiceName";
            Type type = typeof(MyAssembly);
            switch (args[0])
            {
                case "-install":
                    ServiceUtils.InstallService(name, type);
                    ServiceUtils.StartService(args, name);
                    break;
                case "-uninstall":
                    ServiceUtils.StopService(name);
                    ServiceUtils.UninstallService(name, type);
                    break;
                default:
                    throw new NotImplementedException();
            }
        }
    }

当我调试时,我总是向应用程序发送一个参数 (-install)。因此,第一个 if 语句 (if (args.Length == 0) 永远不会执行。这是预期的,我的服务已安装并启动得很好。但是,如果我删除该 if 语句并且只留下 if (args.Length == 1) 语句,我的服务安装正确但它没有启动,我收到以下错误:

Cannot start MyServiceName on computer '.'

我的问题是:为什么第一个 if 语句中的代码在我的应用程序中从未执行过却需要?

这是 InstallService 和 StartService 方法的支持代码(我也从 stackoverflow 获得):

    public static void InstallService(string serviceName, Type t)
    {
        if (IsInstalled(serviceName)) return;

        try
        {
            Assembly a = t.Assembly;
            using (AssemblyInstaller installer = GetInstaller(a))
            {
                IDictionary state = new Hashtable();
                try
                {
                    installer.Install(state);
                    installer.Commit(state);
                }
                catch
                {
                    try
                    {
                        installer.Rollback(state);
                    }
                    catch
                    { }
                    throw;
                }
            }
        }
        catch
        {
            throw;
        }
    }

    public static void StartService(string[] args, string serviceName)
    {
        if (!IsInstalled(serviceName)) return;

        Console.WriteLine("Service is installed.  Attempting to start service.");

        ServiceController sc = new ServiceController();
        sc.ServiceName = serviceName;

        if (sc.Status == ServiceControllerStatus.Stopped)
        {
            Console.WriteLine("Starting {0}: ", sc.ServiceName);
            try
            {
                sc.Start(args);
                sc.WaitForStatus(ServiceControllerStatus.Running);
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
            }
        }
    }

最佳答案

the first if statement (if (args.Length == 0) is NEVER executed

这不正确,它执行了。通过 ServiceController.Start()。您看不到这一点,因为服务 Controller 再次启动您的 EXE,创建另一个进程。这次是服务进程,而不是控制台进程。一个你没有附加调试器的。如果删除该 if 语句,则服务在启动后立即退出。并且服务 Controller 通过“无法启动 MyServiceName”异常消息正确地提示了这一点。

关于c# - .NET Windows 服务是否需要调用 ServiceBase.Run(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5709263/

相关文章:

c# - 使用给定的用户名在远程机器上安装 Windows 服务

c# - PropertyInfo 中的属性与 CustomAttributes

c# - 如何命名同时代表大小和位置的结构?

c# - 有没有办法验证字典的值

unit-testing - 为什么在测试DateTime相等性时此单元测试失败?

c# - 实现行级安全性——(SP 与 LINQ to Objects)

c# - 给定一个 CloudTableQuery/DataServiceQuery,返回关联的 TableServiceContext

c# - 从 UWP 中的 BitmapImage 或流获取 IntPtr 值

java - Tomcat 服务 : quotes in wrapper. 配置文件

c# - 在 Windows 服务中运行的线程中最终不执行