Можно ли запланировать настраиваемое действие RemoveExistingProducts до InstallValidate? - PullRequest
8 голосов
/ 13 января 2010

Задача

У меня есть MSI, который создает и запускает службу Windows во время установки, останавливает и удаляет службу во время удаления. Это прекрасно работает при установке и удалении самостоятельно, но при обновлении отображается диалоговое окно Используемые файлы (только в Vista и более поздних версиях из-за нового Restart Manager ), указывая, что Сервис находится в использовании.

Фон

Диалоговое окно Используемые файлы отображается во время последовательности InstallExecute с помощью пользовательского действия InstallValidate , которое запланировано непосредственно перед RemoveExistingProducts настраиваемое действие; это означает, что предыдущая версия еще не была удалена, поэтому диалоговое окно Используемые файлы должно отображаться .

В документации MSDN указано, что действие RemoveExistingProducts должно быть запланировано после действия InstallValidate , и в настоящее время у меня есть действия RemoveExistingProducts , запланированные сразу после InstallValidate action.

Потенциальное решение

Я бы хотел перенести пользовательское действие RemoveExistingProducts непосредственно перед пользовательским действием InstallValidate , чтобы предыдущая установка имела возможность остановить и удалить службу до Файлы в использовании отображается диалоговое окно. Я попытался переназначить действия, и, похоже, он работает правильно, без побочных эффектов (хотя в журнале все еще указывается, что действие InstallValidate выполняется до действия RemoveExistingProducts ), но я ' Я не решаюсь использовать это решение, поскольку оно нарушает документацию MSDN, и могут возникнуть нежелательные последствия, которых я просто пока не вижу.

Кто-нибудь пробовал это? Единственная альтернатива, о которой я могу подумать, - это чтобы новая установка остановила службу старой установки, но это нежелательно, поскольку для установки требуется информация обо всех старых установках, которые она может обновить (остановка этой конкретной службы может потребовать больше чем просто звонок в Service Manager, чтобы остановить его).

Ответы [ 4 ]

6 голосов
/ 16 февраля 2010

Я реализовал потенциальное решение, обрисованное в общих чертах в вопросе, планируя RemoveExistingProducts непосредственно перед InstallValidate . Я еще не видел никаких проблем, но я опубликую это снова после того, как установка получит больше пользы.

Обновление

Наша установка уже некоторое время использует это, и я не заметил никаких побочных эффектов.

1 голос
/ 07 апреля 2011

Он уже встроен в установщик MSI / Windows ... единственная проблема заключается в том, что классы установщика .NET не используют функции MSI "Установка служб". В действительности MSI пытается установить файлы и выполнить пользовательскую команду, используя только что скопированные файлы (это все, что Visual Studio помещает в MSI).

Чтобы решить эту проблему, вы можете отредактировать MSI с помощью ORCA и добавить следующую строку в таблицу ServiceControl :

1   ServiceName 170     1   C__489628C5CC1144CB47F43E8BE7F3F31D

Идентификатор компонента, который вы можете найти из таблицы FILES ... Я просто выбрал идентификатор компонента основного файла EXE. 170 - это растровое изображение, которое сообщает установщику Windows, что нужно остановить и удалить службу при установке и удалении.

Это очистит путь для установщиков .NET для добавления службы, и вы можете использовать ServiceController для запуска службы после ее установки с помощью пользовательской команды.

0 голосов
/ 21 декабря 2013

Я думаю, что этот поможет вам, не нарушая документацию MSDN и избегая любых будущих проблем.Поместите условие «Установлено ИЛИ PREVIOUSVERSIONSINSTALLED», и вам будет хорошо при обновлении, так как свойство PREVIOUSVERSIONSINSTALLED установлено перед действием InstallValidate во время FindRelatedProducts.Я не знаю почему, но свойство PREVIOUSVERSIONSINSTALLED не задокументировано в MSDN, но оно существует и очень полезно, хотя для меня.

0 голосов
/ 29 января 2010

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

...