2015-07-09 3 views
0

У меня есть установочный и деинсталляционный диалог в моем пользовательском установщике WiX 3.7. Это происходит из моего пользовательского приложения Bootstrapper. Когда мое программное обеспечение не установлено, и я запускаю установщик, он показывает диалог установки. Когда он установлен, и я запускаю установщик, он показывает диалог удаления (пользовательский диалог).Установщик WiX не показывает диалоговое окно удаления после восстановления

Когда я сейчас перестраиваю установщик без изменения чего-либо в проекте установщика WiX и запускаю установщик при установке программного обеспечения, он больше не отображает диалоговое окно удаления. Вместо этого он показывает диалог установки.

Проверка установки приложения или нет в методе DetectBegin для Bootstrapper. Однако, когда я нажимаю на установку, он понимает, что он уже установлен и прервал процесс.

Почему такое поведение происходит? Проверяет ли Bootstrapper, установлен ли он, какой диалог отображать? Так думает ли он, что это другой бутстраппер, потому что он был перестроен?

Если да, то как я могу заставить Bootstrapper показать диалог удаления, когда мое приложение с той же версией уже установлено? Должен ли я включать какое-то условие?

+0

Дополнительная информация: Идентификатор моего продукта жестко запрограммирован и, таким образом, остается неизменным при перестройке. – user975561

ответ

0

Я нашел решение. По-видимому, идентификатор Bundle уникален для каждой сборки, и его невозможно установить. Вот почему при восстановлении обратный вызов Bootstrapper «DetectBegin» имеет свойство «Установлено» в «DetectBeginEventArgs», установленное на false. Именно здесь я принял решение показать диалог установки или удаления.

Теперь я использую обратный вызов «DetectRelatedBundle». Здесь свойство «Операция» для «DetectRelatedBundleEventArgs» установлено на «RelatedOperation.None», если установлено приложение с той же версией, кодом продукта и кодом обновления.

1

Без дополнительной информации о вашем WiX/MSI и пачке настроек там будет немного поломать голову, но:

ProductCode в MSI определяет, установлен продукт или нет. Нет такой вещи, как установка одного и того же продукта (кода) дважды в том же контексте, например, на машину. Он уже установлен по определению, поэтому попытка его установки снова заставляет его перейти в режим обслуживания, для которого, по-видимому, единственным выбором является ваш диалог удаления.

Если вы перестраиваете MSI, не меняя ничего, это не то же самое, если у вас есть Product Id = "*", потому что это означает, что ProductCode будет меняться всякий раз, когда вы его создадите, так что появится новый продукт, и поскольку он не установлен на в системе вы получите диалоговое окно установки.

Поэтому я подозреваю, что вам нужен элемент MajorUpgrade в MSI, чтобы ваш новый MSI с добавленным ProductVersion, таким же UpgradeCode и новыми файлами, обновил старый продукт.

Загрузочный загрузчик работает аналогично, так как это пакет продуктов, который обертывает ваш MSI, поэтому вам, вероятно, понадобится также версия с добавленным пакетом, чтобы обновления MSI, а также инфраструктура пакета (которые могли бы владеть Progreams & Запись функций).