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