Пользовательские настройки приложения C# сохраняются во время обновления

У меня есть приложение C#, которое в настоящее время хранит пользовательские настройки / конфигурации в отдельном XML-файле. В моем приложении используется установщик wix, и id хотел бы знать, есть ли способ сохранить XML-файл, если пользователь устанавливает более новую версию приложения, если они устанавливаются без предварительного удаления старой версии. XML-файл хранится в папке CommonAppData и должен быть удален при удалении приложения.

Резервный вопрос - есть ли лучший способ сделать это, чем мой текущий метод?

ОБНОВИТЬ

Я реализовал следующий код:

    <CustomAction Id = "Cleanup_Files" Directory = "CompanyFolder" ExeCommand = "cmd /C RD 
        &quot;[CommonFolder]&quot; /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 по мере необходимости при удалении, но все равно удаляет каталог при обновлении. Какие изменения необходимы для этого?

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
72
2

Ответы 2

Самый простой способ сделать это: не инсталлировать этот XML-файл при установке, а вместо этого позволить ему создать приложение, если его там нет. При этом обновление не коснется файла. В этом сценарии также можно перенести настройки из более старой (или более новой) версии.

Однако файл также останется при удалении. Если в этом случае требуется удалить его, вы можете сделать это с помощью настраиваемого действия с условием, например Installed AND REMOVE = "ALL" AND NOT UPGRADINGPRODUCTCODE.

Спасибо за ответ, раньше я не использовал кастомные действия. Как структурировать настраиваемое действие и где разместить его в файле product.wxs?

jhorwood28 19.11.2018 17:23

В этом ответе очень простой подход: stackoverflow.com/a/17513551/2142950. Более умные решения требуют написания кода на C#,

Klaus Gütter 19.11.2018 18:05

Привет, Клаус, спасибо за совет, у меня все еще возникают проблемы с его сохранением файлов на месте во время обновления (см. Мое обновление)

jhorwood28 20.11.2018 11:24

Вы можете найти журналы установщика в каталоге% temp%. Каково значение UPGRADINGPRODUCTCODE в файле журнала старого продукта, который был деинсталлирован во время обновления?

Klaus Gütter 20.11.2018 12:00

Для меня решение заключалось в том, чтобы последовать совету Клауса, но с некоторыми дополнительными изменениями в моем файле product.wxs. Мне пришлось добавить AllowSameVersionUpgrades = "yes" в раздел MajorUpgrade.

    <MajorUpgrade AllowSameVersionUpgrades = "yes" DowngradeErrorMessage = "A newer version of 
    [ProductName] is already installed." />

Спасибо Клаусу за все советы!

Другие вопросы по теме