Подтвердить что ты не робот

Как настроить имя службы Windows при установке (или просто во время компиляции)?

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

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

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

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

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

Приветствуются любые предложения.

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

4b9b3361

Ответ 1

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

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"

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

Ответ 2

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

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

Ответ 3

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