Не удается обновить службу Windows, установленную MSI - PullRequest
0 голосов
/ 30 августа 2018

У меня странная проблема, и я не могу найти рабочее решение. Заранее спасибо за любую помощь.

Я разработал Службу Windows на C #, которая использует библиотеку Newtonsoft.JSON для анализа результата из набора WebAPI. Служба развернута с MSI, и все работает отлично.

Первая версия сервиса использовала Newtonsoft.JSON 6.0.8, но недавно я перешел на версию 11.0.2.

Я упаковал новый MSI (с правильной версией / Product Id / Upgrade Id, чтобы обеспечить обновление), и я пытаюсь развернуть новую версию с помощью небольшого установочного приложения, которое выполняет следующее:

  1. Остановите службу (если она установлена ​​и работает) с помощью System.ServiceProcess.ServiceController
  2. Удалите службу с помощью System.ServiceProcess.ServiceController
  3. Запустите System.Process, который вызывает msiexec для нового файла MSI

Результат: служба не работает, и из журнала я вижу, что приложение все еще ищет версию 6.0.8 Newtonsoft.JSON.

Если я попробую следующее:

  1. Щелкните правой кнопкой мыши на msi -> Удалить
  2. Щелкните правой кнопкой мыши на msi -> Установить

Все работает нормально, сервис использует версию библиотеки 11.0.2 ...

Я схожу с ума по этому поводу ... Как я могу исправить / очистить процесс обновления?

Заранее спасибо

1 Ответ

0 голосов
/ 30 августа 2018

Сводка : измените и расширьте свой MSI для обработки всех задач, связанных с обслуживанием: service installation, service deletion, service control. Для этого используйте встроенные конструкции MSI.


Установка службы : Не уверен, что я выполнил полное описание сценария проблемы, но дело в том, что вы должны позволить самому MSI контролировать установку службы и управление службой во время установки и Процесс обновления. Службы устанавливаются и управляются в файлах MSI с помощью таблиц ServiceInstall и ServiceControl - которые отображаются непосредственно на элементы XML WiX, как показано здесь:

<Component>
   <File Source="$(var.SourceDir)\WindowsService.exe" />
   <ServiceInstall Name="MyService" ErrorControl="normal" Start="auto" Type="ownProcess" />
   <ServiceControl Id="MyService" Name="MyService" Start="install" Stop="both" Remove="uninstall" Wait="yes" />
</Component>

Позвольте мне дать ссылку на аналогичный пример на github ( Rainer Stropek ), если вышеприведенное не ясно. Это более полный и сложный.


Ссылки : В этом ответе обсуждается та же проблема: Служба установки и управления . Использование пользовательских действий или пользовательских исполняемых файлов для управления службами, установки или удаления считается анти-шаблоном развертывания - это не является ни необходимым, ни желательным, ни надежным. MSI является полнофункциональным и надежным, если его правильно использовать (если только у вас нет особого и необычного сервиса, требующего пользовательских действий «по какой-то причине» . Исправление, новое исправление следует: »для некоторых очень хороших причина ").

...