4

如何将参数传递给 installutil MyService.exe Parameter1 Parameter2

我的 MyService 是一个 Windows 服务。我想将参数传递给该服务。

4

3 回答 3

4

覆盖 ProjectInstaller 类的 install 方法

public override void Install(System.Collections.IDictionary stateSaver)
        {
              base.Install(stateSaver);
              string lParam1 = Convert.ToString(GetParam("Param1"));  

        }

        private object GetParam(string p)
        {
            try
            {
                if (this.Context != null)
                {
                    if (this.Context.Parameters != null)
                    {
                        string lParamValue = this.Context.Parameters[p];
                        if (lParamValue != null)
                            return lParamValue;
                    }
                }
            }
            catch (Exception ex )
            {

            }
            return string.Empty;
        }

并使用安装服务installutil /Param1=value path_to_your_exename

于 2013-08-29T06:15:39.127 回答
1

首先,您需要将安装程序插入到您的服务中。但我想你已经结束了。否则请阅读以下内容:

https://docs.microsoft.com/en-us/dotnet/framework/windows-services/how-to-add-installers-to-your-service-application

正如@Sumeshk 提到的,您可以使用 installutil 将参数传递给此安装程序, installutil /Param1=value path_to_your_exename并通过this.Context.Parameters.

现在您想将这些参数作为参数传递给您的服务。诀窍是将它们附加到assemblypath安装之前,如您在此处看到的:

如何在安装而不是每次启动时一劳永逸地将参数传递给 Windows 服务

因此,您必须覆盖安装程序方法OnBeforeInstall。然后,您可以通过附加参数来操作给定的组装路径。不要忘记在OnBeforeInstall最后调用基本方法:

protected override void OnBeforeInstall(IDictionary savedState)
{
    string oldPath = this.Context.Parameters["assemblypath"];
    string yourParam = this.Context.Parameters["Param1"];
    string pathWithParam = $"\"{oldPath}\" \"{yourParam }\"";
    this.Context.Parameters["assemblypath"] = pathWithParam;
    base.OnBeforeInstall(savedState);
}

请注意,为避免参数或程序集路径中可能出现的空格问题,您应该用双引号将这些字符串框起来。用空格分隔每个参数。如果这样做,ImagePath您在注册表中的服务将由路径加上由空格分隔的参数组成。您可以在密钥中找到它HKLM\SYSTEM\CurrentControlSet\Services\<your service name>

现在您可以在方法的参数中评估您的服务中的args参数OnStart

protected override void OnStart(string[] args)
{
    Debug.WriteLine("Param1: {args[0]}");
}
于 2020-04-22T15:28:04.267 回答
0

我对@Rouvens 帖子的评价太低了。我首先要感谢他的回答。但是,我想做一个小的更正。

您通过安装程序组件注册的参数不会像他声称的那样HKLM\SYSTEM\CurrentControlSet\Services\<your service name>直接传递给。OnStart(string[] args)

相反,它们遵循服务的构造函数:

public partial class MyService : ServiceBase
{
    string myArgument;

    public MyService(string[] args)
    {            
        InitializeComponent();
        
        this.myArgument= {args[0]}; // this is where you capture your argument
    }
}

之后,您必须在不考虑 OnStart 参数的情况下传递这些值。

protected override void OnStart(string[] args)
{
    BusinessLogicControl.Main(new string[] { myArgument});
}
于 2021-06-11T05:39:35.543 回答