Как передать аргументы для установки MyService.exe Parameter1 Parameter2

Как передать аргументы для установки MyService.exe Parameter1 Parameter2

Я MyService - это служба Windows. Я хочу передать аргументы этому сервису.

4 ответа

Переопределить метод установки класса ProjectInstaller

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

Для начала вам нужно вставить установщик в свой сервис. Но я полагаю, ты уже забыл об этом. В противном случае прочтите это:

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]}");
}

У меня слишком мало репутации, чтобы комментировать пост @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});
}
Другие вопросы по тегам