Как передать аргументы для установки 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
Это то, что вы ищете?
http://diaryofadeveloper.wordpress.com/2012/04/26/using-paramters-with-installutil/
Мэтью.
Для начала вам нужно вставить установщик в свой сервис. Но я полагаю, ты уже забыл об этом. В противном случае прочтите это:
Как упомянул @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});
}