У меня есть приложение C#, которое в настоящее время хранит пользовательские настройки / конфигурации в отдельном XML-файле. В моем приложении используется установщик wix, и id хотел бы знать, есть ли способ сохранить XML-файл, если пользователь устанавливает более новую версию приложения, если они устанавливаются без предварительного удаления старой версии. XML-файл хранится в папке CommonAppData и должен быть удален при удалении приложения.
Резервный вопрос - есть ли лучший способ сделать это, чем мой текущий метод?
ОБНОВИТЬ
Я реализовал следующий код:
<CustomAction Id = "Cleanup_Files" Directory = "CompanyFolder" ExeCommand = "cmd /C RD
"[CommonFolder]" /s /q" Execute = "deferred" Return = "ignore" HideTarget = "no"
Impersonate = "no" />
<InstallExecuteSequence>
<Custom Action = "Cleanup_Files" Before = "RemoveFiles" >
Installed AND REMOVE = "ALL" AND NOT UPGRADINGPRODUCTCODE
</Custom>
</InstallExecuteSequence>
Это удаляет каталог CommonFolder по мере необходимости при удалении, но все равно удаляет каталог при обновлении. Какие изменения необходимы для этого?





Самый простой способ сделать это: не инсталлировать этот XML-файл при установке, а вместо этого позволить ему создать приложение, если его там нет. При этом обновление не коснется файла. В этом сценарии также можно перенести настройки из более старой (или более новой) версии.
Однако файл также останется при удалении. Если в этом случае требуется удалить его, вы можете сделать это с помощью настраиваемого действия с условием, например Installed AND REMOVE = "ALL" AND NOT UPGRADINGPRODUCTCODE.
В этом ответе очень простой подход: stackoverflow.com/a/17513551/2142950. Более умные решения требуют написания кода на C#,
Привет, Клаус, спасибо за совет, у меня все еще возникают проблемы с его сохранением файлов на месте во время обновления (см. Мое обновление)
Вы можете найти журналы установщика в каталоге% temp%. Каково значение UPGRADINGPRODUCTCODE в файле журнала старого продукта, который был деинсталлирован во время обновления?
Для меня решение заключалось в том, чтобы последовать совету Клауса, но с некоторыми дополнительными изменениями в моем файле product.wxs. Мне пришлось добавить AllowSameVersionUpgrades = "yes" в раздел MajorUpgrade.
<MajorUpgrade AllowSameVersionUpgrades = "yes" DowngradeErrorMessage = "A newer version of
[ProductName] is already installed." />
Спасибо Клаусу за все советы!
Спасибо за ответ, раньше я не использовал кастомные действия. Как структурировать настраиваемое действие и где разместить его в файле product.wxs?