我有一个控制台应用程序,可以自行安装自己作为服务。这很好用,但我想在服务启动中嵌入一些参数 - 类似于(例如)Google的更新服务(其参数为/medsvc
)
所以,让我们说我喜欢我的服务开始
MyService.exe RUN Test1
..以便使用参数MyService.exe
和RUN
启动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的带有参数的更新服务 - 我希望最终达到同样的效果。
答案 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参数)。