Итак, мы создали службу Windows для передачи данных нашему клиентскому приложению, и все идет отлично. Клиент придумал забавный запрос конфигурации, который требует, чтобы два экземпляра этой службы работали на одном сервере и были настроены так, чтобы указывать на разные базы данных.
До сих пор я не мог этого добиться и надеялся, что мои коллеги-участники stackoverflow смогут дать некоторые подсказки, почему.
Текущая настройка:
Я настроил проект, содержащий службу Windows, с этого момента мы будем называть его AppService, и файл ProjectInstaller.cs, который обрабатывает пользовательские шаги установки, чтобы задать имя службы на основе ключа в App.config, например, так :
this.serviceInstaller1.ServiceName = Util.ServiceName;
this.serviceInstaller1.DisplayName = Util.ServiceName;
this.serviceProcessInstaller1.Account = System.ServiceProcess.ServiceAccount.LocalSystem;
В этом случае Util - это просто статический класс, который загружает имя службы из файла конфигурации.
С этого момента я пробовал два разных способа установить обе службы, и оба потерпели неудачу одинаково.
Первый способ заключался в том, чтобы просто установить первую копию службы, скопировать установленный каталог и переименовать его, а затем выполнить следующую команду после изменения конфигурации приложения, чтобы изменить желаемое имя службы:
InstallUtil.exe /i AppService.exe
Когда это не сработало, я попытался создать второй проект установщика, отредактировал файл конфигурации и построил второй установщик. Когда я запустил установщик, он работал нормально, но служба не отображалась в services.msc, поэтому я выполнил предыдущую команду для второй установленной базы кода.
Оба раза я получил следующий вывод от InstallUtil (только соответствующие части):
Запуск транзакционной установки.
Начало этапа установки.
Установка службы приложений два ... Служба приложений службы два успешно установлена. Создание службы приложений источника журнала событий Два в приложении журнала ...
Исключение произошло на этапе установки. System.NullReferenceException: ссылка на объект не установлена на экземпляр объекта.
Начинается этап отката установки.
Восстановление журнала событий до предыдущего состояния для исходной службы приложений 2. Служба приложений-служб 2 удаляется из системы ... Служба приложений-служб 2 была успешно удалена из системы.
Этап отката успешно завершен.
Транзакционная установка завершена. Установка не удалась, откат выполнен.
Извините за многословный пост, хотел убедиться, что в нем достаточно актуальной информации. Кусок, который до сих пор меня озадачил, заключается в том, что в нем говорится, что установка службы завершается успешно, и только после того, как она перейдет к созданию источника EventLog, который, похоже, выбрасывается. Так что, если кто-нибудь знает, что я делаю не так или у меня есть лучший подход, я был бы очень признателен.
http://journalofasoftwaredev.wordpress.com/2008/07/16/multiple-instances-of-same-windows-service/
. Вы можете вставить код в программу установки, чтобы получить нужное имя службы при запуске installutil.