Подтвердить что ты не робот

Сохраняйте пользовательские настройки после изменения версии сборки/файла

Фон
У меня есть простое приложение WinForms, написанное на С#. Я некоторое время обсуждал решения для развертывания, но в конечном итоге решил отказаться от ClickOnce, поскольку некоторые из ограничений были крайне жесткими.

Вместо этого я применил простое решение для версии приложения через версии сборки/файла (я держу их в синхронизации) в свойствах приложения. Я развертываю проект Setup (*.msi). Я храню последний номер версии сборки в файле XML в Интернете, а также последний файл установщика. Во время выполнения я просто проверяю Application.ProductVersion на последнюю версию онлайн и открываю диалоговое окно обновления, если доступно обновление.

Проблема
До сих пор это работало очень хорошо, но я недавно заметил серьезную проблему с этим подходом. Когда обновлена ​​версия сборки приложения, в AppData/Company/Product/Version/blahblahblah создается новая версия файла пользовательских настроек (user.config). Это явно заставляет пользователя reset все в новой версии.

Рекомендуемые решения
Я не уверен, как действовать дальше. У приложения только 1 релиз до сих пор, а текущая пользовательская база - это в основном тот, с кем я могу попросить его протестировать, поэтому переключение стратегий не имеет большого значения. Я подумал:

1.) Напишите мою собственную систему настроек и, таким образом, получите полный контроль над тем, где/как хранится и используется файл настроек.
2.) Передумайте мою стратегию по версии/обновлению, чтобы обновление не было основано на версии сборки. Я не уверен, как это сделать, но мое тестирование показало, что даже создание и установка новой версии с той же версией сборки все равно сломает user.config.

Я предполагаю, что я действительно спрашиваю, есть ли способ сохранить систему настроек по умолчанию, поскольку она настолько проста в использовании, что приспосабливает ее к моей стратегии развертывания.

4b9b3361

Ответ 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".

Надеюсь, это поможет!