Как я могу читать/записывать настройки app.config во время выполнения без использования пользовательских настроек?

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

  • Все пользователи устройства должны обмениваться настройками.
  • В вызовах поддержки (особенно в кризисных ситуациях) трудно объяснить пользователям/сотрудникам, где их можно найти и изменить вручную (appdata - это скрытая папка между прочим).
  • Новые версии приложения должны использовать предыдущие настройки (пользовательские настройки, похоже, сбрасываются с новыми версиями).
  • Обычно наши сотрудники копируют приложение в новую папку, которая также сбрасывает пользовательские настройки.

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

В противном случае мне очень нравится использовать настройки приложения и хотел бы продолжать использовать их, если это возможно. Было бы идеально, если бы настройки могли находиться в той же папке, что и EXE (например, в файлах good ol ini).

ПРИМЕЧАНИЕ. Это приложение WPF, а не веб-приложение ASP.net, поэтому нет web.config.

Ответ 1

Ну, я еще не хотел изменять настройки приложения во время выполнения (для чего я использую пользовательские настройки), но то, что я смог сделать, это записать настройки приложения во время установки. Я предполагаю, что подобный подход может работать во время выполнения. Вы можете попробовать это, так как нет, похоже, каких-либо других реквизитных решений ATM.

    exePath = Path.Combine( exePath, "MyApp.exe" );
    Configuration config = ConfigurationManager.OpenExeConfiguration( exePath );
    var setting = config.AppSettings.Settings[SettingKey];
    if (setting != null)
    {
        setting.Value = newValue;
    }
    else
    {
        config.AppSettings.Settings.Add( SettingKey, newValue);
    }

    config.Save();

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

Ответ 2

Это метод, который позволяет изменять записи в <AppSettings>:

    internal static bool SetSetting(string Key, string Value)
    {
        bool result = false;
        try
        {
            System.Configuration.Configuration config =
              ConfigurationManager.OpenExeConfiguration(
                                   ConfigurationUserLevel.None);

            config.AppSettings.Settings.Remove(Key); 
            var kvElem= new KeyValueConfigurationElement(Key, Value);
            config.AppSettings.Settings.Add(kvElem);

            // Save the configuration file.
            config.Save(ConfigurationSaveMode.Modified);

            // Force a reload of a changed section.
            ConfigurationManager.RefreshSection("appSettings");                

            result = true;
        }
        finally
        { }
        return result;
    } // function

Примечание, которое я нашел, необходимо обновить раздел appSettings после обновления.

Функция удаляет ключ, прежде чем он добавит его, чтобы избежать двойных записей. Это также работает, если ключ ранее не существовал. Если есть какая-либо ошибка, он возвращает false, при успешном true. Метод чтения настроек тривиален и просто указан для полноты:

    internal static string GetSetting(string Key)
    {
        string result = null;
        try
        {
            result = ConfigurationManager.AppSettings[Key];
        }
        finally
        { }
        return result;
    } // function

Заметьте, что я окружил его блоком try... finally для подавления ошибок. Если возникают какие-либо ошибки, то GetSetting просто возвращает null, а SetSetting возвращает false. Это упрощает обработку, однако, если вам нужны исключения, вы можете добавить

        catch (Exception) { throw; }

чтобы исключить исключение для вызывающего. Или, для отладки вы можете добавить:

        #if DEBUG
        catch (Exception ex) { 
                System.Diagnostics.Debug.WriteLine(ex.ToString()); 
        }
        #endif

Будет отображаться исключение в окне Вывод Visual Studio, если вы выбрали конфигурацию "Отладка", но продолжите с кодом.


Примечание (перекрестная ссылка на аналогичную тему):

  • Раздел applicationSettings отличается, поскольку он различает область "Пользователь" и "Приложение" и поддерживает разные типы данных, а не только строки. Если вы хотите узнать, как можно обрабатывать applicationSettings, вы можете найти его здесь (в stackoverflow):
    Как получить доступ к applicationSettings

  • Если вы не уверены, следует ли использовать appSettings или applicationSettings, тогда прочитать это, прежде чем вы решите его.

  • Если вы столкнулись с предупреждением 'ConfigurationSettings.AppSettings' is obsolete, тогда этот подсказку поможет вам.

Ответ 3

Приложения WPF могут получить доступ к файлу app.config так же, как приложения WinForms через

ConfigurationManager.OpenExeConfiguration()

метод. Хитрость заключается в том, чтобы иметь значения, которые вы хотите получить в теге AppSettings вашего файла App.config(также доступны в приложениях WPF).

Всякий раз, когда вы закончите изменять свои свойства, обязательно вызовите следующие методы:

MyConfig.Save(ConfigurationSaveMode.Modified)
ConfigurationManager.RefreshSection("appSettings")

Я написал полное "как" на этом некоторое время назад, что объясняет все это здесь.