Как настроить имя службы Windows после установки (или просто во время компиляции)? - PullRequest
21 голосов
/ 07 мая 2009

Я создал службу Windows в C #, установил ее на сервере, и она работает нормально.

Теперь я хочу снова установить ту же службу, но запущенную из другого рабочего каталога, с другим конфигурационным файлом и т. Д. Таким образом, я хотел бы иметь два (или более) экземпляра одного и того же служба работает одновременно. Первоначально это невозможно, так как установщик будет жаловаться, что уже установлена ​​служба с указанным именем.

Я могу преодолеть это, изменив мой код, установив для свойства ServiceBase.ServiceName новое значение, затем перекомпилировав и снова запустив InstallUtil.exe. Однако я бы предпочел установить имя службы во время установки, то есть в идеале я бы сделал что-то вроде

InstallUtil.exe / i / servicename = "MyService Instance 2" MyService.exe

Если это недостижимо (я очень в этом сомневаюсь), я хотел бы иметь возможность вводить имя службы при создании службы. Я подумал, что можно было бы использовать какое-то событие сборки, использовать хитрый msbuild или nant трюк или что-то в этом роде, но я не понимаю.

Любые предложения будут с благодарностью.

Спасибо за ваше время.

Ответы [ 3 ]

28 голосов
/ 08 мая 2009

Я попытался получить доступ к конфигурации, используя

ConfigurationManager.OpenExeConfiguration(string exePath)

в установщике, но не смог заставить его работать.

Вместо этого я решил использовать System.Environment.GetCommandLineArgs() в установщике так:

string[] commandlineArgs = Environment.GetCommandLineArgs();

string servicename;
string servicedisplayname;
ParseServiceNameSwitches(
    commandlineArgs, 
    out servicename, 
    out servicedisplayname);

serviceInstaller.ServiceName = servicename;
serviceInstaller.DisplayName = servicedisplayname;

Теперь я могу установить свои сервисы, используя

InstallUtil.exe / i InstallableService.dll / Имя_службы = "myserviceinstance_2" / servicedisplayname = "Мой сервис Экземпляр 2 "

Я написал более подробное объяснение здесь .

4 голосов
/ 07 мая 2009

Вы не можете передать это как аргумент командной строки, так как InstallUtil не предоставляет правильные ловушки для этого.

Однако вы можете настроить установщик службы для чтения ServiceName из файла конфигурации. Если вы посмотрите на некоторый код для типичного ServiceInstaller, вы увидите, что это просто вопрос настройки соответствующих свойств DisplayName и ServiceName во время выполнения. Их можно легко прочитать из файла конфигурации, а не жестко запрограммировать.

2 голосов
/ 15 августа 2013

Вместо использования Environment.GetCommandLineArgs(); класс Installer имеет свойство с именем Context, из которого вы можете получить доступ к аргументам командной строки, передаваемым InstallUtil, структурированным в симпатичном StringDictionary.

...