代码之家  ›  专栏  ›  技术社区  ›  Rune

如何在安装时(或在编译时)配置Windows服务的名称?

  •  21
  • Rune  · 技术社区  · 17 年前

    我在C中创建了一个Windows服务,将它安装在服务器上,运行正常。

    现在我想再次安装相同的服务,但是从不同的工作目录运行,有不同的配置文件等。因此,我想 (或更多)同时运行的同一服务的实例。 最初,这是不可能的,因为安装程序会抱怨已经安装了具有给定名称的服务。

    我可以通过更改代码、设置 ServiceBase.ServiceName 属性设置为新值,然后重新编译并再次运行InstallUtil.exe。但是,如果我可以在安装时设置服务名,我会更愿意这样做,也就是说,理想情况下我会做

    installUtil.exe/i安装程序 /servicename=“myService实例2” MyService

    如果这不可能实现(我非常怀疑),我希望在构建服务时能够注入服务名。我认为有可能使用某种构建事件,使用一个巧妙的msbuild或nant技巧或类似的方法,但我没有任何线索。

    任何建议都将不胜感激。

    谢谢你抽出时间。

    3 回复  |  直到 10 年前
        1
  •  28
  •   Rune    10 年前

    我尝试使用

    ConfigurationManager.OpenExeConfiguration(string exePath)
    

    在安装程序中,但无法使其工作。

    相反,我决定使用 System.Environment.GetCommandLineArgs() 在这样的安装程序中:

    string[] commandlineArgs = Environment.GetCommandLineArgs();
    
    string servicename;
    string servicedisplayname;
    ParseServiceNameSwitches(
        commandlineArgs, 
        out servicename, 
        out servicedisplayname);
    
    serviceInstaller.ServiceName = servicename;
    serviceInstaller.DisplayName = servicedisplayname;
    

    现在我可以使用

    installUtil.exe/i安装程序 可安装服务.dll /servicename=“myServiceInstance_2” /serviceDisplayName=“我的服务 实例2

    我写了一个更详细的解释 here .

        2
  •  4
  •   Markus Jarderot    10 年前

    不能将其作为命令行arg传入,因为installUtil没有为此提供正确的挂钩。

    但是,您可以让服务安装程序从配置文件中读取servicename。如果你 look at some code 对于典型的ServiceInstaller,您将看到,在运行时设置适当的DisplayName和ServiceName属性只是一个问题。这些可以很容易地从配置文件中读取,而不是硬编码。

        3
  •  2
  •   Arthur Rizzo    12 年前

    而不是使用 Environment.GetCommandLineArgs(); 班级 Installer 具有名为的属性 Context 从中可以访问传递给installUtil的命令行参数。 StringDictionary .

    推荐文章