2010-07-13 2 views
3

У меня есть существующая (на основе C#) служба Windows, которая получена из Installer class, и я в настоящее время использую предоставленную MS командную строку InstallUtil для ее установки и удаления. Это прекрасно работает, и в рамках моей системы я подключил обработчики событий к событиям AfterUninstallEventHandler и CommittedEventHandler. В моем случае я просто использую их для регистрации сообщений в журнале специальных событий - показывая даты и время установки и удаления, а также версии программ.Служба установки WiX и пользовательские события установки

На данный момент я экспериментирую с Wix v3.5 Beta 1, чтобы упаковать кучу моих вещей, включая эту услугу, и я использую Wix ServiceInstall и ServiceControl, чтобы заменить то, что я сделал вручную с помощью InstallUtil.

Однако, похоже, что для установки служб Wix использует совершенно другой механизм InstallUtil. Это видно из названия и описания службы, которой управляет Wix (в отличие от того, что было встроено в сервисную программу), и что мои события больше не срабатывают (что, если используется другой механизм установки, я сомневаюсь, что они).

Возможно ли, чтобы Wix выполнил установку сервиса так же, как InstallUtil, или я просто собираюсь мириться с различиями?

Редактировать

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

+0

Затем у вас установщик сохранит имя источника события в разделе реестра или app.config и попросит вашу службу прочитать это значение и использовать его для доступа к журналу событий. Я действительно не вижу практики «очень плохого программного обеспечения». Это всего лишь контракт между вашим сервисом и установщиком, где установщик создает источник событий «x», а служба записывает в «x». В конце концов, это просто записи в реестре, которые MSI хорошо обрабатывает. Плохая практика заключалась бы в том, чтобы MSI делал все, кроме этого, а затем изобретал велосипед без кода процесса. –

+0

Последняя мысль: Давайте притворимся, что это приложение winforms, которое написано в журнале событий. Предположим, что администратор установил MSI, но никогда не запускал программу. Тогда не-администратор запустил программу. Как у него есть разрешения на создание события? Однако, если MSI создаст источник событий, он сможет. –

+0

Хорошо, что отношения между моим установщиком и сервисом в качестве контракта были полезной идеей для меня (и я согласен с этим), но это также помогает мне укрепить мою проблему, которая у меня есть - это то, что это неофициальный контракт, который не может быть принудительно (как вы гарантируете, что ключи реестра совпадают между сторонами контракта?).Метод InstallUtil может быть ужасным взломом, который подвержен ошибкам, но в моем случае он предоставляет более формальный контракт, который может быть применен, хотя по умолчанию информация определяется только в одном месте. Но, кстати, я ценю ваши комментарии, и они помогают! –

ответ

2

С точки зрения инсталлятора Windows InstallUtil является злым противником, потому что он внедряет хрупкие из кода процесса в декларативную модель программирования. Установщик Windows уже давно имеет таблицы ServiceInstall и ServiceControl, и это работает очень хорошо. То же самое относится к Regasm и Regserver. Мы предпочитаем извлекать данные COM и записывать их в установщик, и MSI позаботится о применении значения реестра, а затем загружает сборки и вызывает точки входа в надежде, что он работает. Когда он терпит неудачу, вы не знаете, почему и вы не можете откатить состояние машины.

Что вы делаете в своих мероприятиях? Я бы либо устранил, либо реорганизовал каждый из них в то, что MSI может сделать для вас. Если этого еще недостаточно, напишите настраиваемое действие DTF и назначьте его между InstallServices и StartServices.

+0

Я понимаю, что вы говорите, но у меня нет фона, чтобы очернить InstallUtil таким образом. Однако то, с чем я не сталкивался, - это эффект вашего предлагаемого решения. Если я создаю настраиваемый метод, теперь Wix * и * my Service должны знать имя моего выделенного журнала событий, и я не могу представить, как экспортировать имя из моего кода сервера в выражение Wix, поэтому мне нужно будет определить имя в 2-х местах .. плохой код .. плохой код! Это общий вопрос, который у меня есть с проектами Wix (и я предполагаю msi). В краткосрочной перспективе я мог бы написать стандартное имя журнала событий, например приложение. –

+0

Я занимаюсь установками в течение 14 лет - 7 из тех лет были MSI. Google мое имя, и вы увидите мою работу: я эксперт, и я InstallUtil сосет. Поверьте мне, MSI - это огромный шаг вперед от инсталляторов, основанных на сценариях, и образец MSI был вокруг, прежде чем DevDiv ушел и заново изобрел колесо. MSI также должна поддерживать неуправляемые службы, существовавшие задолго до CLR. Если вы делаете в своем коде создание журналов событий, это легко сделать в WiX. http://stackoverflow.com/questions/58538/how-do-you-create-an-event-log-source-using-wix –

+0

Если вы создаете установщика и смотрите MSI в ORCA, вы будете см. это всего лишь некоторые синтаксические сахара ключи/значения реестра, используемые для определения журнала событий и источника. BTW Я не вижу WiX и вашего сервиса, зная имя журнала событий как проблему SoC. Задача установщика заключается в установке вашего приложения, и работа вашего приложения выполняется без установки вашего приложения. –

Смежные вопросы