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

Posted

技术标签:

【中文标题】Windows 服务 - 在“可执行文件路径”中提供参数【英文标题】:Windows service - supplying arguments in "path to executable" 【发布时间】:2011-02-28 17:19:51 【问题描述】:

我不知道如何在启动时将(常量)参数传递到我的 Windows 服务中。我正在使用像 ServiceBase 这样的标准 .NET 类来实现(以及 ServiceProcessInstaller 和 ServiceInstaller 来安装)我的服务。

在 Windows 服务属性对话框(安装后)的常规选项卡上,有一个“可执行文件路径”,我可以在其中看到一些标准 Windows 服务指定了命令行参数。 System.ServiceProcess.ServiceBase.OnStart 采用 string[] args,我认为这将使这些参数能够从 .NET 代码中访问。

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

【问题讨论】:

【参考方案1】:

嗯,在您发帖后大约 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”作为参数。

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

我希望这会有所帮助。

【讨论】:

【参考方案2】:

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

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

【讨论】:

谢谢。安装项目中的注册表视图对我来说有点笨拙。我尝试使用派生自 ServiceInstaller 的自定义类,在该类中我覆盖了 Install 方法,但基类在整个路径周围加上了引号,并使我试图实现的目标无效。我想如果我真的需要这样做,需要一些思考......但我可能会找到另一种将值传递给服务的方法。

以上是关于Windows 服务 - 在“可执行文件路径”中提供参数的主要内容,如果未能解决你的问题,请参考以下文章

因为曾经装过Mysql导致再次装时windows无法启动MySQL服务报错1067的解决方法

如何在windows上配置php环境

10.0.4_对应的相关Windows服务

Qt 部署的可执行文件打开空白应用程序

visual studio 路径配置解决办法

mac mysql为啥提示无权限修改配置文件