Обнаружение удаления в состоянии запуска с помощью Wix MSI

Я играл с Wix, создавая небольшое приложение с автоматически сгенерированным установщиком и тремя версиями для проверки возможности обновления: 1.0, 1.1 и 2.0.

1.1 предназначен для возможности обновления с 1.0 и не позволяет пользователю устанавливать 1.1, если 1.1 уже присутствует.

        <Upgrade Id="MY_UPGRADECODE_GUID">
            <UpgradeVersion Minimum="1.0.0"
                                            IncludeMinimum="yes"
                                            Maximum="1.0.0"
                                            IncludeMaximum="yes"
                                            Property="OLDERVERSIONBEINGUPGRADED" />
            <UpgradeVersion Minimum="1.1.0"
                                            IncludeMinimum="yes"
                                     OnlyDetect="yes"
                                     Property="NEWERVERSIONDETECTED" />
        </Upgrade>

        <Condition Message="A later version of [ProductName] is already installed. Setup will now exit.">
            NOT (NEWERVERSIONDETECTED OR Installed)
        </Condition>

Проблема №1: 1.1 не может быть деинсталлирован, потому что при деинсталляции ставится и проверяется условие.

2.0 предназначен для обновления с 1.1, а не для обновления с 1.0 («слишком старый»). Он также не должен устанавливаться поверх самого себя.

    <Upgrade Id="MY_UPGRADECODE_GUID">
        <UpgradeVersion Minimum="1.1.0"
        IncludeMinimum="yes"
        Maximum="1.1.0"
        IncludeMaximum="yes"
        Property="OLDERVERSIONBEINGUPGRADED" />
    </Upgrade>

    <Upgrade Id="MY_UPGRADECODE_GUID">
        <UpgradeVersion Minimum="2.0.0"
        OnlyDetect="yes"
        Property="NEWERVERSIONDETECTED" />
    </Upgrade>

    <Upgrade Id="MY_UPGRADECODE_GUID">
        <UpgradeVersion Minimum="1.0.0"
        IncludeMinimum="yes"
        Maximum="1.0.0"
        IncludeMaximum="yes"
        Property="TOOOLDVERSIONDETECTED" />
    </Upgrade>  

    <Condition Message="A later version of [ProductName] is already installed. Setup will now exit.">
        NOT NEWERVERSIONDETECTED OR Installed
    </Condition>

    <Condition Message="A version of [ProductName] that is already installed is too old to be upgraded. Setup will now exit.">
        NOT TOOOLDVERSIONDETECTED
    </Condition>

Проблема № 2: Если я попытаюсь обновиться с 1.1, я столкнусь с измененным условием более поздней версии. (Ошибка: уже установлена ​​более поздняя версия основного приложения 1.1. Программа установки завершит работу.) Проблема №3: ​​Программа установки позволяет установить 2.0 поверх самого себя.

Что я делаю неправильно с моим кодом обновления и условиями, чтобы получить эти проблемы в моих MSI?


person Coxy    schedule 10.03.2010    source источник


Ответы (2)


Хорошо, я понял, что есть трюк, который вы можете использовать, чтобы иметь возможность обнаруживать удаления.

Моя версия 1.1 WXS изменилась на:

        <Condition Message="A later version of [ProductName] is already installed. Setup will now exit.">
            NOT NEWERVERSIONDETECTED OR REMOVE ~= "ALL"
        </Condition>

и в версии 2.0:

        <Condition Message="A later version of [ProductName] is already installed. Setup will now exit.">
            NOT NEWERVERSIONDETECTED OR REMOVE ~= "ALL"
        </Condition>

        <Condition Message="A version of [ProductName] that is already installed is too old to be upgraded. Setup will now exit.">
            OLDERVERSIONBEINGUPGRADED OR (NOT Installed AND NOT TOOOLDVERSIONDETECTED) OR REMOVE ~= "ALL"
        </Condition>

Таким образом, мои LaunchConditions никогда не будут срабатывать при удалении и будут правильно определять, какая версия обновляется, если таковая имеется.

person Coxy    schedule 10.03.2010
comment
Строго говоря, это работает только потому, что WiX упорядочивает действие FindRelatedProducts перед LaunchConditions. Так, например, если пользовательский интерфейс дает вам выбор между пользователем и компьютером, то FindRelatedProducts не может быть запущен до тех пор, пока пользователь не сделает этот выбор, потому что для поиска требуется, чтобы был известен контекст установки. Поэтому его нельзя использовать в запущенном состоянии. - person PhilDW; 24.10.2015

Я предполагаю, что когда вы ссылаетесь на определенную версию своего приложения, скажем «приложение 1.1», вы всегда говорите об одном и том же устанавливаемом образе. В отличие от нескольких неидентичных устанавливаемых образов (например, с разными кодами пакетов), которые просто имеют общий номер версии продукта.

Если это так, вам не нужно ничего делать, чтобы явно заблокировать установку приложения 1.1 пользователем, когда приложение 1.1 уже установлено. Служба установки распознает, что приложение 1.1 уже установлено, и не позволит вам установить его снова. Он появится в режиме обслуживания. Он считает, что вы хотите добавить или удалить функцию или, возможно, удалить продукт.

person Ed.    schedule 11.03.2010