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

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

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

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

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

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

Ответы [ 3 ]

9 голосов
/ 09 сентября 2010

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

    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();

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

6 голосов
/ 07 августа 2012

Это метод, который позволяет изменять записи в <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 просто возвращает ноль, а 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 голосов
/ 09 сентября 2010

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

ConfigurationManager.OpenExeConfiguration()

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

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

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

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

...