Как я могу остановить.exe на ремонт, обновление и удаление в wix?

В моем wix я использую следующее объявление:

<ComponentGroup Id="BinComponents" Directory="BIN">
  <Component Id="BinComponent" Guid="23D229D0-06EE-49f4-80B4-6D7136500721">

    <File Id="MyProjectOutput" Name="MyProject.exe" Source="MyProject\bin\MyProject.exe"/>
    <ServiceControl Id="RemoveService"
       Stop="both"
       Remove="both"
       Name="MyProject.exe"
       Wait="yes" /> <!-- Stop running MyProject instances -->

  </Component>
</ComponentGroup>

Мое Репро:

Сначала я запускаю установку как обычно. После установки я запускаю свое веб-приложение..Exe в диспетчере задач появляется как обычно:

Я хочу закончить этот.exe на ремонт, обновление или удаление. Поэтому я снова запускаю.msi и выбираю ремонт:

Теперь моя проблема: после нажатия "Восстановить", я ожидаю следующее диалоговое окно из-за заявленного ServiceControl:

Но это не так. Вместо этого появляется следующий диалог:

Когда я регистрирую настройки, журнал показывает следующие строки:

MSI (s) (A8:DC) [10:16:28:227]: Executing op: ActionStart(Name=StopServices,Description=Stopping services,Template=Service: [1])
Action 10:16:28: StopServices. Stopping services
MSI (s) (A8:DC) [10:16:28:228]: Executing op: ProgressTotal(Total=1,Type=1,ByteEquivalent=1300000)
MSI (s) (A8:DC) [10:16:28:228]: Executing op: ServiceControl(,Name=MyProject.exe,Action=2,Wait=1,)
MSI (s) (A8:DC) [10:16:28:228]: Executing op: ActionStart(Name=DeleteServices,Description=Deleting services,Template=Service: [1])
Action 10:16:28: DeleteServices. Deleting services
MSI (s) (A8:DC) [10:16:28:228]: Executing op: ProgressTotal(Total=1,Type=1,ByteEquivalent=1300000)
MSI (s) (A8:DC) [10:16:28:229]: Executing op: ServiceControl(,Name=MyProject.exe,Action=8,Wait=1,)
MSI (s) (A8:DC) [10:16:28:229]: Executing op: ActionStart(Name=InstallFiles,Description=Copying new files,Template=File: 
[1],  Directory: [9],  Size: [6])

[...]

MSI (s) (7C:28) [09:06:21:950]: RESTART MANAGER: Did detect that a critical application holds file[s] in use, so a reboot will be necessary.
MSI (s) (7C:28) [09:06:21:950]: Note: 1: 1610 
MSI (s) (7C:28) [09:06:21:950]: Note: 1: 2205 2:  3: Error 
MSI (s) (7C:28) [09:06:21:950]: Note: 1: 2228 2:  3: Error 4: SELECT `Message` FROM `Error` WHERE `Error` = 1610 

Рядом с ремонтом я также попробовал обновление с такими же результатами. Возможно, какая-либо декларация отсутствует? Примечание: Когда я закрываю MyApp.exe в диспетчере задач, сообщение не появляется, поэтому MyApp.exe определенно отвечает за проблему.

2 ответа

Диалоговое окно предупреждения, которое вы видите, происходит из стандартного действия "InstallValidate". Я сталкивался с подобной проблемой в прошлом. Я исправил это, используя один элемент управления службами вместо нескольких элементов управления службами для одного и того же идентификатора службы. В моем случае у меня было несколько элементов управления службами для одного и того же идентификатора службы.

Это по ссылке на http://windows-installer-xml-wix-toolset.687559.n2.nabble.com/Upgrade-uninstall-restart-issue-td7586315.html

Это помогло мне. Многочисленные пользователи сообщили о том же поведении, хотя оно официально не задокументировано. Наличие одного элемента управления службой заставляет Restart Manager принять к сведению запись в таблице Service Control и не позволит Restart Manager перечислять службу в диалоговом окне RMFilesInUse, либо не даст Restart Manager вызвать предупреждающие сообщения, информирующие пользователя о том, что перезапуск может быть обязательным. Вот еще одна ссылка Не могу запустить службу Windows с WiX

Мои эксперименты показали, что существует определенная связь между количеством элементов управления службами и Restart Manager http://microsoft.public.windows.msi.narkive.com/OOuQQAsw/controlling-restart-manager-behaviour

Другой вариант состоял в том, чтобы полностью отключить RestartManager, используя свойство RESTARTMANAGERCONTROL. В случае, если вы отключите RestartManager, вам может быть предложено перезагрузить компьютер (возможно, вы захотите проверить его один раз), и устаревший механизм "Используемые файлы" запускается. Отключение Restart Manager является осознанным решением заинтересованного разработчика MSI и иногда становится необходимым.

Я не уверен, как выглядит ваша таблица Service Control. Просто хотел поделиться с вами своим опытом.

Надеюсь, это поможет.

С уважением, Киран Хегде

Вы должны опубликовать весь журнал где-нибудь. Основная причина заключается в том, что для восстановления обычно не требуется замена файлов. Так что, если вы буквально установили свой продукт, запустили исполняемый файл, а затем для восстановления нужно заменить файлы, тогда проблема не в том, что диалоговое окно использует файлы, а в том, что установленный продукт не работает, поэтому необходимые файлы или записи реестра были удален. Журнал событий приложения должен содержать записи MsiInstaller, описывающие отсутствующий компонент. Поэтому сначала посмотрите на эту основную причину.

После исправления это должно быть очень редким случаем, когда ремонт должен заменить файлы, так что о нем не стоит беспокоиться. Но вы можете посмотреть на интеграцию вашего приложения с Restart Manager или с помощью утилиты WiA CloseApplication.

Другие вопросы по тегам