В основном проблема заключается в том, что каждый раз, когда изменяется версия сборки (т. Е. Пользователь устанавливает новую версию приложения), все их настройки сбрасываются по умолчанию (или, точнее, новый файл user.config создается в папке с другой версией номер как имя)
Как я могу сохранить те же настройки при обновлении версий, поскольку использование файлов ini или реестра кажется не рекомендуется?
Когда мы использовали Clickonce, казалось, что он мог справиться с этим, поэтому кажется, что это должно быть в состоянии сделать, но я не уверен, как.
.net
settings
assemblyversions
Davy8
источник
источник
Ответы:
ApplicationSettingsBase имеет метод Upgrade, который переносит все настройки из предыдущей версии.
Чтобы выполнять слияние при публикации новой версии вашего приложения, вы можете определить логический флаг в файле настроек, который по умолчанию имеет значение true. Назовите его UpgradeRequired или что-то подобное.
Затем при запуске приложения вы проверяете, установлен ли флаг, и если это так, вызовите метод Upgrade , установите флаг в false и сохраните свою конфигурацию.
Узнайте больше о методе обновления на MSDN . GetPreviousVersion также может быть стоит посмотреть , если вам нужно сделать некоторые пользовательские слияния.
источник
appSettings
,userSettings
илиapplicationSettings
? Как пользовательский параметр в Settings.Settings, после первого изменения значения false он никогда не будет верным. Новая версия не вернет значение UpgradeRequired обратно в True.Я знаю, что это было какое-то время ... В приложении winforms просто позвоните,
My.Settings.Upgrade()
прежде чем загружать их. Это позволит получить последние настройки, будь то текущая версия или предыдущая версия.источник
Вот мое исследование на случай, если кому-то еще будет трудно перенести настройки, которые были изменены / удалены. Основная проблема заключается в том,
GetPreviousVersion()
что не работает, если вы переименовали или удалили параметр в новой версии вашего приложения. Поэтому вам нужно сохранить настройку в своемSettings
классе, но добавить к ней несколько атрибутов / артефактов, чтобы вы случайно не использовали ее в коде где-либо еще, что делает его устаревшим. Пример устаревшей настройки будет выглядеть в VB.NET следующим образом (его можно легко перевести на C #):Убедитесь, что вы добавили это свойство в то же пространство имен / класс, в котором находятся настройки вашего приложения. В VB.NET этот класс назван
MySettings
и доступен вMy
пространстве имен. Вы можете использовать частичную функциональность класса, чтобы предотвратить смешивание устаревших настроек с текущими настройками.Полная благодарность jsharrison за публикацию отличной статьи по этому вопросу. Вы можете прочитать более подробную информацию об этом там.
источник
Вот вариант решений, представленных здесь, которые инкапсулируют логику обновления в абстрактный класс, из которого могут наследовать классы настроек.
Некоторые предлагаемые решения используют атрибут DefaultSettingsValue для указания значения, которое указывает, когда предыдущие параметры не были загружены. Я предпочитаю просто использовать тип, значение которого по умолчанию указывает на это. В качестве бонуса, DateTime? полезна отладочная информация.
Получите из UserSettingsBase:
И используйте это:
источник
Если ваши изменения в user.settings выполняются программно, как насчет сохранения копии (просто) изменений для user.settings в отдельном файле, например user.customized.settings?
Вы, вероятно, все еще хотите сохранить и загрузить измененные настройки в user.settings. Но таким образом, когда вы устанавливаете более новую версию своего приложения с более новой версией user.settings, вы можете спросить пользователя, хотят ли они продолжать использовать свои измененные настройки, скопировав их обратно в новый user.settings. Вы можете импортировать их оптом, или полюбоваться и попросить пользователя подтвердить, какие настройки они хотят продолжать использовать.
РЕДАКТИРОВАТЬ: я слишком быстро прочитал «более точную» часть о версиях сборки, в результате чего новые user.settings были установлены в новый каталог для конкретной версии. Таким образом, идея выше, вероятно, не поможет вам, но может дать пищу для размышлений.
источник
Вот как я справился с этим:
}
и в классе настроек я определил свойство IsDefault:
В SaveSettings я установил для IsDefault значение false:
источник