WiX - сохранение настроек реестра при серьезном обновлении - PullRequest
7 голосов
/ 20 декабря 2011

Мы используем 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 компонентов значение "да", но это имеет неприятный эффект: не удается воссоздать ключи - возможно, потому что он проверяет, существуют ли ключи до удаления происходит (что, очевидно, происходит), затем они удаляются при удалении, но не восстанавливаются снова.

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

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

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

1 Ответ

10 голосов
/ 21 декабря 2011

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

...