Можно ли запланировать пользовательское действие RemoveExistingProducts перед InstallValidate?
-
20-09-2019 - |
Вопрос
Проблема
У меня есть MSI, который создает и запускает службу Windows во время установки и останавливает и удаляет службу во время удаления.Это прекрасно работает при установке и удалении само по себе, но при обновлении Используемые файлы отображается диалоговое окно (только в Vista и более поздних версиях из-за нового Диспетчер перезапуска), указывающий на то, что сервис используется.
Предыстория
В Используемые файлы диалоговое окно отображается во время Установкавыполнить последовательность с помощью InstallValidate Установить validate пользовательское действие, которое запланировано непосредственно перед Удалениесуществующие продукты пользовательское действие;это означает, что предыдущая версия еще не была удалена, поэтому Используемые файлы диалоговое окно следует быть показанным.
Документация MSDN указывает , что Удалениесуществующие продукты действие должно быть запланировано после InstallValidate Установить validate действие, и в настоящее время у меня есть Удалениесуществующие продукты действия, запланированные сразу после InstallValidate Установить validate Экшен.
Потенциальное Решение
Я хотел бы перенести Удалениесуществующие продукты пользовательское действие непосредственно перед InstallValidate Установить validate пользовательское действие, чтобы у предыдущей установки была возможность остановить и удалить службу перед Используемые файлы появится диалоговое окно.Я попытался перепланировать действия, и, похоже, это работает корректно без каких-либо неблагоприятных побочных эффектов (хотя в журнале по-прежнему указано, что InstallValidate Установить validate действие выполняется до того, как Удалениесуществующие продукты действие), но я не решаюсь использовать это решение, поскольку оно нарушает документацию MSDN, и могут возникнуть побочные эффекты, которых я просто пока не вижу.
Кто-нибудь пробовал это?Единственная другая альтернатива, о которой я могу подумать, - заставить новую установку остановить службу старой установки, но это нежелательно, поскольку для этого требуется, чтобы у установки была информация обо всех старых установках, которые она может обновить (остановка этой конкретной службы может включать в себя нечто большее, чем простой вызов диспетчера служб, чтобы остановить ее).
Решение
Я реализовал потенциальное решение, изложенное в вопросе, планирование Удалениесуществующие продукты непосредственно перед InstallValidate Установить validate.Я пока не видел никаких проблем, но я опубликую сообщение снова после того, как установка станет более полезной.
Обновить
Наша установка использует это в течение некоторого времени, и я не заметил никаких побочных эффектов.
Другие советы
Он уже встроен в установщик MSI / Windows ...единственная проблема заключается в том, что .Классы СЕТЕВОГО установщика не используют функции MSI "Service Installation".Что на самом деле происходит, так это то, что MSI пытается установить файлы и запустить пользовательскую команду, используя только что скопированные файлы (это все, что Visual Studio помещает в MSI).
Чтобы решить эту проблему, вы можете отредактировать MSI с помощью ORCA и добавить следующую строку в Контроль обслуживания таблица:
1 ServiceName 170 1 C__489628C5CC1144CB47F43E8BE7F3F31D
Идентификатор компонента вы можете найти в таблице FILES ...Я просто выбрал идентификатор компонента основного EXE-файла.170 - это растровое изображение, которое сообщает установщику Windows остановить и удалить службу при установке и деинсталляции.
Это расчистит путь для .СЕТЕВЫЕ установщики могут добавить службу, и вы можете использовать ServiceController для запуска службы после ее установки с помощью пользовательской команды.
Одна из потенциальных проблем может заключаться в том, что если пользователь отменит во время InstallValidate (напримериз-за нехватки места на диске или используемого файла) или во время установки, каково поведение отката.Идеальная ситуация заключается в том, что состояние приложения такое же, как и раньше (напримерпредыдущее приложение установлено).Возможно, вы отказываетесь от этого при своем упорядочивании, хотя откат может быть функцией, без которой вы можете обойтись.
Я думаю, что это поможет вам, не нарушая документацию MSDN, и избежать любых будущих проблем.Поставьте условие "Установлено или PREVIOUSVERSIONSINSTALLED", и вы также сможете выполнить обновление, поскольку свойство PREVIOUSVERSIONSINSTALLED устанавливается перед действием InstallValidate во время FindRelatedProducts.Я не знаю почему, но свойство PREVIOUSVERSIONSINSTALLED не задокументировано в MSDN, но оно существует и, тем не менее, очень полезно для меня.