Служба Windows - предоставление аргументов в «пути к исполняемому файлу» - PullRequest
2 голосов
/ 07 июня 2010

Я не могу понять, как передавать (постоянные) аргументы в мою службу Windows, когда она запускается. Я использую стандартные классы .NET, такие как ServiceBase, чтобы реализовать (а ServiceProcessInstaller и ServiceInstaller установить) мой сервис.

На вкладке «Общие» диалогового окна свойств службы Windows (после ее установки) есть «Путь к исполняемому файлу», в котором я вижу, что для некоторых стандартных служб Windows указаны аргументы командной строки. System.ServiceProcess.ServiceBase.OnStart занимает string[] args, что, как я полагаю, позволило бы получить доступ к этим аргументам из кода .NET.

Есть ли какие-либо свойства в ServiceProcessInstaller или ServiceInstaller, которые я могу установить, чтобы разрешить мне передавать аргументы запуска моей собственной службе, или кто-нибудь знает, как это должно быть сделано?

Ответы [ 2 ]

2 голосов
/ 12 апреля 2011

Ну, прошло около 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 и поместить в них код вместо корневого класса Installer.Это нигде не задокументировано, возможно, может сломаться в будущем и может не работать на версиях .NET Framework, выпущенных не Microsoft, но пока работает.

Надеюсь, это поможет.

1 голос
/ 07 июня 2010

Аргументы OnStart () предоставляются, когда пользователь запускает службу вручную с помощью команды запуска sc.exe из командной строки.Или это можно сделать программно с помощью перегрузки метода ServiceControl.Start (string []).Это редко полезно, вы, вероятно, хотите, чтобы ваша служба запускалась автоматически без необходимости входа пользователя в систему.

Да, раздел реестра ImagePath поддерживает передачу аргументов в .exe, вы получите их через Main(строка []) точка входа.К сожалению, ServiceInstaller не поддерживает это.Лучшим способом было бы использовать реестр.В вашем установщике создайте ключ HKLM \ System \ CurrentControlSet \ services \ yourServiceName \ Parameters и запишите в него значения.И прочитайте их обратно в методе Main или OnStart вашего сервиса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...