Windows服务 - 在“可执行文件的路径”中提供参数

时间:2010-06-07 13:50:18

标签: .net windows-services

我无法弄清楚如何在启动时将(常量)参数传递给我的Windows服务。我正在使用像ServiceBase这样的标准.NET类来实现(以及安装ServiceProcessInstaller和ServiceInstaller)我的服务。

在Windows服务属性对话框的常规选项卡上(安装后),有一个“可执行路径”,其中我可以看到某些标准Windows服务具有指定的命令行参数。 System.ServiceProcess.ServiceBase.OnStartstring[] args,我认为这样可以在.NET代码中访问这些参数。

ServiceProcessInstaller或ServiceInstaller上是否有一些属性可以设置为允许我将启动参数传递给我自己的服务,或者有人知道它应该如何完成吗?

2 个答案:

答案 0 :(得分:2)

嗯,这是你发帖后大约10个月,我有同样的问题。一旦我阅读了这个线程和其他人,我决定看看.NET Framework在幕后做了什么,并确认没有记录的方法来做到这一点。有;然而,这是一种非常简单的无证方式。在父Installer类中,要么覆盖Install方法,要么实现BeforeInstall事件。无论哪种,您可以使用以下任何一种:

public override void Install(System.Collections.IDictionary stateSaver)
{
    base.Install(stateSaver);

    base.Context.Parameters["assemblyPath"] = string.Format("\"{0}\" /service", base.Context.Parameters["assemblyPath"]);
}

或:

private void Installer_BeforeInstall(object sender, InstallEventArgs e)
{
    base.Context.Parameters["assemblyPath"] = string.Format("\"{0}\" /service", base.Context.Parameters["assemblyPath"]);
}

“assemblyPath”参数将使用AssemblyInstaller类中的可执行文件的完整路径进行初始化。此参数的值将写入注册表中的ImagePath值。如果不存在,则将围绕此值放置引号,因此请确保将它们放在需要它们的位置(即至少在初始值附近)。在上面的行中,我在执行文件路径周围放置了引号,并在结尾添加了“/ service”作为参数。

这将适用于使用该父安装程序类的所有服务。如果您有不希望添加参数或需要不同参数的服务,则可以嵌套安装程序类并将代码放在那些而不是根安装程序类上。这在任何地方都没有记录,将来可能会中断,并且可能无法在非.NET版本的.NET Framework上运行,但它现在可以正常工作。

我希望这会有所帮助。

答案 1 :(得分:1)

当用户使用命令行中的sc.exe start命令手动启动服务时,会提供OnStart()参数。或者可以使用ServiceControl.Start(string [])方法重载以编程方式完成。这很少有用,您可能希望自动启动服务而无需用户登录。

是的,ImagePath注册表项确实支持将参数传递给.exe,您将通过Main(string [])入口点获取它们。不幸的是,ServiceInstaller不支持这一点。更好的方法是使用注册表。在安装程序中,创建HKLM \ System \ CurrentControlSet \ services \ yourServiceName \ Parameters键并将值写入其中。并在您的服务的Main或OnStart方法中阅读它们。