Как я могу читать/записывать настройки 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")
Я написал полное "как" на этом некоторое время назад, что объясняет все это здесь.