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

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

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

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

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

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

3 ответа

Решение

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

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

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

Это метод, который позволяет изменять записи в <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 отличается, так как он различает область действия "Пользователь" и "Приложение" и поддерживает разные типы данных, а не только строки. Если вы хотите узнать, как вы можете обрабатывать настройки приложения, вы можете найти его здесь (в stackru):
    Как получить доступ к настройкам приложения

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

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

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

ConfigurationManager.OpenExeConfiguration()

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

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

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

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

Другие вопросы по тегам