Отже, ми створили службу 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 (лише відповідні частини):
Запуск встановленої транзакції.
Починаючи фазу встановлення інсталяції.
Встановлення служби App Service Two ... Служба App Service Two успішно встановлена. Створення джерела подій EventLog Служба додатків два у програмі журналу ...
Виняток стався на етапі встановлення. System.NullReferenceException: посилання на об'єкт не встановлено як екземпляр об'єкта.
Починається фаза відкоту установки.
Відновлення журналу подій до попереднього стану для вихідної Служби додатків Два. Служба App Service Two видаляється з системи ... Служба App Service Two була успішно видалена з системи.
Фаза відкоту успішно завершена.
Транзакційне встановлення завершено. Не вдалося встановити, і було виконано відкат.
Вибачте за довгий вітряний пост, хотів переконатися, що є достатньо відповідної інформації. Поки що мене це заплутало, це те, що він стверджує, що встановлення служби завершується успішно, і лише після того, як він переходить до створення джерела EventLog, яке, здається, NullReferenceException видається. Тож якщо хтось знає, що я роблю не так, або має кращий підхід, це буде вдячний.
http://journalofasoftwaredev.wordpress.com/2008/07/16/multiple-instances-of-same-windows-service/
. Ви можете вставити код в інсталятор, щоб отримати ім'я послуги, яке ви хочете під час запуску installlutil.