Попросите пользователя закрыть приложение во время удаления (в WiX)
Я использую установщик Windows XML 3.0 (WIX3) для установки некоторого программного обеспечения.
все работает нормально, однако мне очень трудно справиться со следующим случаем использования: установленное программное обеспечение по-прежнему работает, когда пользователь пытается удалить его. Поведение по умолчанию, похоже, удаляет все файлы, но позволяет приложению работать (что трудно увидеть в моем случае, потому что он сидит в панели задач).
я добавил следующие на мой код :
<InstallExecuteSequence>
<Custom Action="WixCloseApplications" Before="RemoveFiles" />
</InstallExecuteSequence>
<util:CloseApplication Id="CloseFoobar"
CloseMessage="no"
Description="FooBar is still running!"
ElevatedCloseMessage="no"
RebootPrompt="no"
Target="foobar.exe" />
но это не работает - еще хуже, он показывает диалог, который запрашивает перезагрузку во время установить!
что было бы правильным способом сделать это?
6 ответов
насколько я помню, достаточно добавить следующие ссылки на ваш пользовательский интерфейс:
<DialogRef Id="FilesInUse" />
<DialogRef Id="MsiRMFilesInUse" />
материал CloseApplication предназначен только для закрытия приложений во время установки, но он глючит (по крайней мере, когда я пробовал его несколько месяцев назад, может быть, он исправлен сейчас?)
к сожалению, это снова пример для очень плохой документации WiX, даже стандартные сценарии установки/удаления, подобные этому, не документированы.
пару дней назад был задан аналогичный вопрос в списке рассылки Wix-users. Ответ был такой:
Так работает Windows pre-Vista и менеджер перезапуска. Там должно быть окно верхнего уровня доступный. Приложение в трее не рассчитывать.
есть несколько тем по теме в Викс-пользователи архиве как хорошо.
для примера использования closeapplication перейдите по этой ссылке: проект wix github, модульные тесты
для отображения диалогового окна приглашения можно использовать:
<util:CloseApplication Id="CloseIE" Target="iexplore.exe" PromptToContinue="yes" Description="Test" />
можете ли вы проверить журналы удаления (вот как их включить), насколько я помню, установщик Windows поместит ваши файлы в состояние ожидания удаления и попросит перезагрузку в конце.
Также вы можете написать простое пользовательское действие, которое будет убивать процесс.
ответ Шей правильный. Последние версии установщика Windows просто ведут себя таким образом. Установщик Windows идет очень много неприятностей, чтобы убедиться, что вы можете избежать перезагрузки при удалить путем повторного сопоставления в использовании библиотек DLL и т. д. В общем, запущенное приложение может продолжать работать после удаления, и некоторая очистка произойдет, когда приложение выключится, остальное после следующей перезагрузки. Дело в том, что если установщик Windows может переместить используемые двоичные файлы в другое место, запустите все приложения и замените те, которые использовались (но поддержка памяти переназначена), и все, что требуется, - это удалить немного несущественного мусора при следующей перезагрузке, тогда зачем заставлять перезагрузку? Нет необходимости показывать диалог "файлы в использовании", чтобы такая ситуация не возникла.
Это может вызвать проблемы, если приложение пытается открыть файл, который был удален, но я предполагаю, что риск оценивается как низкий. Если приложение должно знать, что удаление происходит, то интеграция с Restart Manager должна работать - Windows скажет, что происходит удаление. В противном случае Шей прав. При необходимости напишите пользовательское действие удаления, чтобы сообщить приложению о закрытии.
Я также столкнулся с этой проблемой. Изменение атрибута Before на "InstallValidate" сработало для меня.
<Custom Before="InstallValidate" Action="WixCloseApplications"/>