Можно ли запланировать пользовательское действие RemoveExistingProducts перед InstallValidate?

StackOverflow https://stackoverflow.com/questions/2057936

  •  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, но оно существует и, тем не менее, очень полезно для меня.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top