自行安装使用参数

时间:2016-07-11 16:57:10

标签: c# service installer

我有一个控制台应用程序,可以自行安装自己作为服务。这很好用,但我想在服务启动中嵌入一些参数 - 类似于(例如)Google的更新服务(其参数为/medsvc

enter image description here

所以,让我们说我喜欢我的服务开始

MyService.exe RUN Test1

..以便使用参数MyService.exeRUN启动Test1

我可以使用

安装服务
  ManagedInstallerClass.InstallHelper(new[] {Assembly.GetExecutingAssembly().Location});

但是,服务上没有参数。所以,如果我尝试:

  ManagedInstallerClass.InstallHelper(new[] {Assembly.GetExecutingAssembly().Location +" RUN Test1"});

我得到FileNotFoundException。如果它是一个数组,我想我会尝试:

ManagedInstallerClass.InstallHelper(new[] {Assembly.GetExecutingAssembly().Location,"RUN","Test1"});

..除了它现在试图找到文件RUN之外,它给出了相同的例外。

我无法找到有关如何实现此目的的任何具体文档 - 有谁知道是否可以在服务可执行路径中嵌入参数?另一个例子是,这里有Google的带有参数的更新服务 - 我希望最终达到同样的效果。

3 个答案:

答案 0 :(得分:0)

只有位置之前的参数才会传递到安装程序的上下文中。 试试这个:

args = new[] { "/ServiceName=WinService1", Assembly.GetExecutingAssembly().Location };
ManagedInstallerClass.InstallHelper(args);

另一个答案的参考:Passing Parameter Collection to Service via InstallHelper

答案 1 :(得分:0)

我在Windows服务中使用控制台应用程序。 Program.cs中的Main方法处理命令行args。 OnStart方法启动控制台应用程序。它很棒。

Windows Service to Run Constantly

HybridService Easily Switch Between Console Application and Service

答案 2 :(得分:0)

我花了一段时间才发现这一点,我希望它对某人有用。 首先我发现,根据MSDN文档,你不应该运行ManagedInstallerClass.InstallHelper:

  

此API支持产品基础架构,但并非如此   直接从您的代码中使用。

然后我发现我可以使用我自己的ProjectInstaller(我添加的包含Service Installer和Service Process Installer的组件类)来安装这样的服务:

ProjectInstaller projectInstaller = new ProjectInstaller();
            string[] cmdline = { string.Format("/assemblypath={0} \"/myParam\"", Assembly.GetExecutingAssembly().Location) };
            projectInstaller.Context = new InstallContext(null, cmdline);

            System.Collections.Specialized.ListDictionary state = new System.Collections.Specialized.ListDictionary();
            projectInstaller.Install(state);

请务必将参数封装在引号中并转义引号,否则您的参数将成为可执行路径的一部分而无法启动。

最终结果将是一个新服务,其中包含Service Installer和Service Process Installer中的指定属性,以及一个类似截图的路径(例如/ medsvc参数)。