WiX - сохранение настроек реестра при крупном обновлении

Мы используем WiX 3.5 для создания установщика для одного из наших продуктов. Для простоты мы обрабатываем обновления версий с помощью крупных обновлений, например:

<MajorUpgrade AllowSameVersionUpgrades="yes" DowngradeErrorMessage="Laterversionfound" />

Мы не указываем атрибут Schedule, что означает, что действие RemoveExistingProducts должно выполняться после «InstallValidate», то есть будет выполнено полное удаление старой версии перед установкой новой версии.

Мы устанавливаем некоторые параметры реестра HKLM, которые пользователь должен настроить после установки. Поскольку при крупном обновлении выполняется полное удаление с последующей переустановкой, мы теряем пользовательские настройки в реестре. В идеале мы должны иметь возможность сохранять их при обновлении.

Мои ключевые компоненты реестра выглядят так:

<Component Id="regserver" Guid="[guid]">
    <RegistryValue Root="HKLM" Key="Software\Our Company\Our Product" Name="Server" Value="" Type="string" KeyPath="yes" />
</Component>

Я попытался установить для свойства NeverOverwrite компонентов значение «yes», но это имеет неприятный эффект, заключающийся в невозможности воссоздать ключи - предположительно потому, что он проверяет, существуют ли ключи до удаления ( что, очевидно, они и делают), затем они удаляются при деинсталляции, но не воссоздаются снова.

Я также попытался установить атрибут «RemoveFeatures» в элементе MajorUpgrade, чтобы удалить все, кроме ключей reg. Тем не менее, остается две версии продукта, так как функция, содержащая ключи реестра, принадлежит старой версии.

Мой следующий шаг - попробовать запланировать опцию RemoveExistingProducts в другой момент, хотя я ожидаю некоторой боли при использовании некоторых наших настраиваемых действий.

Итак, мой вопрос: есть ли способ достичь того, что нам нужно, не меняя место, где запланировано RemoveExistingProducts?


person Paul Nearney    schedule 20.12.2011    source источник
comment
Можете ли вы изменить исходный установщик? Если это так, вы можете сделать компонент реестра постоянным, что означает, что он не будет удален.   -  person David Martin    schedule 20.12.2011
comment
Правильно ли я полагаю, что при этом настройки останутся неизменными, даже если продукт будет удален? В идеале я бы предпочел полностью чистую деинсталляцию для наших клиентов.   -  person Paul Nearney    schedule 20.12.2011


Ответы (1)


Используйте RegistrySearch для загрузки текущих значений в свойства, затем используйте [PROPERTY] в RegistryValue для записи этих значений. Если не установлен более старый продукт, свойства сохранят свои значения по умолчанию.

person Bob Arnson    schedule 21.12.2011