【问题标题】:Use installutil to install a single service from an executable that has multiple services使用 installutil 从具有多个服务的可执行文件安装单个服务
【发布时间】:2017-01-21 00:56:47
【问题描述】:

我创建了一个定义了 2 个服务的可执行文件,其步骤与以下帖子类似:Can I have multiple services hosted in a single windows executable

在这种情况下,如果我使用 installutil.exe 安装服务,它看起来就像安装了所有定义的服务(在这种情况下为 2)。有了这个实现,有没有办法让 installutil.exe 只安装我在命令行中指定的服务(例如 installutil.exe /service=Service1 ),而不是所有定义的服务?

谢谢!

【问题讨论】:

    标签: c# .net windows service


    【解决方案1】:

    是的。您可以从项目安装程序的Context 访问命令行,只运行您想要的安装程序。

    例如,如果我覆盖项目安装程序上的安装,然后我可以检查命令行以查看要执行的操作。

    public override void Install(IDictionary stateSaver)
    {
        var foo = Context.Parameters["foo"];
        Console.WriteLine($"Foo is {foo}");
        if (foo.Equals("bar"))
        {
            Console.WriteLine("Installing Service1");
            this.Installers.Remove(serviceInstaller2);
            base.Install(stateSaver);
        }
        else if (foo.Equals("baz"))
        {
            Console.WriteLine("Installing Service2");
            this.Installers.Remove(serviceInstaller1);
            base.Install(stateSaver);
        }
    }
    

    然后我像这样调用installutil exe:

    installutil /foo="bar" WindowsService1.exe
    

    请务必注意,您的命令行参数需要位于包含服务安装程序的程序集之前。

    【讨论】:

    • 效果很好,谢谢!我必须做的唯一额外的事情是确保我也使用基本相同的代码覆盖“卸载”方法,这有助于选择性地安装和卸载服务。
    • 其实@John 好像还有一个问题。让我知道这是否应该是一个单独的问题。如果我采用这种方法,并且只在给定服务器上安装一个服务,那么当我启动服务时执行的代码始终是入口点中第一个服务的代码,而不是另一个,无论我使用什么服务安装。一直无法弄清楚为什么会这样。我还需要做些什么来确保正确服务的代码运行吗?
    猜你喜欢
    • 2012-05-04
    • 2010-09-07
    • 1970-01-01
    • 2017-04-05
    • 1970-01-01
    • 1970-01-01
    • 2011-06-19
    • 2013-01-18
    • 2013-10-24
    相关资源
    最近更新 更多