Сохраняйте пользовательские настройки после изменения версии сборки/файла
Фон
У меня есть простое приложение WinForms, написанное на С#. Я некоторое время обсуждал решения для развертывания, но в конечном итоге решил отказаться от ClickOnce, поскольку некоторые из ограничений были крайне жесткими.
Вместо этого я применил простое решение для версии приложения через версии сборки/файла (я держу их в синхронизации) в свойствах приложения. Я развертываю проект Setup (*.msi). Я храню последний номер версии сборки в файле XML в Интернете, а также последний файл установщика. Во время выполнения я просто проверяю Application.ProductVersion на последнюю версию онлайн и открываю диалоговое окно обновления, если доступно обновление.
Проблема
До сих пор это работало очень хорошо, но я недавно заметил серьезную проблему с этим подходом. Когда обновлена версия сборки приложения, в AppData/Company/Product/Version/blahblahblah создается новая версия файла пользовательских настроек (user.config). Это явно заставляет пользователя reset все в новой версии.
Рекомендуемые решения
Я не уверен, как действовать дальше. У приложения только 1 релиз до сих пор, а текущая пользовательская база - это в основном тот, с кем я могу попросить его протестировать, поэтому переключение стратегий не имеет большого значения. Я подумал:
1.) Напишите мою собственную систему настроек и, таким образом, получите полный контроль над тем, где/как хранится и используется файл настроек.
2.) Передумайте мою стратегию по версии/обновлению, чтобы обновление не было основано на версии сборки. Я не уверен, как это сделать, но мое тестирование показало, что даже создание и установка новой версии с той же версией сборки все равно сломает user.config.
Я предполагаю, что я действительно спрашиваю, есть ли способ сохранить систему настроек по умолчанию, поскольку она настолько проста в использовании, что приспосабливает ее к моей стратегии развертывания.
Ответы
Ответ 1
Используйте встроенные классы настроек, вам просто нужно обновить настройки в любое время, когда вы измените версию приложения. Вот как это сделать:
В файле Settings.settings создайте новый параметр
Тип UpdateSettings = bool Scope = Пользовательское value = True
Включите следующий код, прежде чем использовать какие-либо настройки (он может запускаться каждый раз, когда приложение запускается, так как это облегчает работу в отладчике)
// Copy user settings from previous application version if necessary
if (MyApp.Properties.Settings.Default.UpdateSettings)
{
MyApp.Properties.Settings.Default.Upgrade();
MyApp.Properties.Settings.Default.UpdateSettings = false;
MyApp.Properties.Settings.Default.Save();
}
При запуске новой версии приложения UpdateSettings будет иметь значение по умолчанию True, и ни одна из ваших старых настроек не будет использоваться. Если UpdateSettings истинно, мы обновляем настройки из старых настроек и сохраняем их в новой версии приложения.
Ответ 2
Вот как я это решил.
В GUI-приложении очень легко восстановить настройки, выполнив
Properties.Settings.Default.Upgrade ();
Properties.Settings.Default.Reload ();
Properties.Settings.Default.NewVersionInstalled = false;
Properties.Settings.Default.Save ();
Однако у меня всегда была проблема, что все другие библиотеки потеряли свои настройки при установке новой версии. При следующей реализации программное обеспечение проходит через все сборки AppDomain и восстанавливает настройки соответствующей библиотеки:
foreach(var _Assembly in AppDomain.CurrentDomain.GetAssemblies())
{
foreach(var _Type in _Assembly.GetTypes())
{
if(_Type.Name == "Settings" && typeof(SettingsBase).IsAssignableFrom(_Type))
{
var settings = (ApplicationSettingsBase)_Type.GetProperty("Default").GetValue(null, null);
if(settings != null)
{
settings.Upgrade();
settings.Reload();
settings.Save();
}
}
}
}
Я реализовал код в проекте App.xaml.cs проекта GUI, и он будет всегда выполняться, когда новая версия будет установлена в значение "NewVersionInstalled".
Надеюсь, это поможет!