Как мне извлечь ApplicationSettings из загруженного файла App.config?
-
21-09-2019 - |
Вопрос
Можно ли получить доступ к значениям из Настройки приложений раздел загруженного файла app.config?
Я нашел пример Как мне восстановить Настройки приложений, но я не могу узнать, как получить доступ Настройки приложений сюда.
Решение
Тот самый Настройки приложений являются только для чтения во время выполнения.Вы можете установить / изменить их либо непосредственно с помощью текстового редактора в файле app.config, но рекомендуется открыть свойства проекта в Visual Studio и выбрать вкладку "Настройки".Важно установить правильную область применения:
- Если настройки применимы ко всему приложению (для всех пользователей), выберите "Приложение" в качестве области действия.
- Если у каждого пользователя должны быть индивидуальные настройки (привязанные к профилю пользователя), то выберите "Пользователь".
Например, если вы создадите Моя установка в вашем проекте WindowsFormsTestApplication1 Приложение для тестирования Windowsformstest следующим образом:
это добавит следующее в файл app.config приложения:
<configuration>
<configSections>
<sectionGroup name="applicationSettings" type="System.Configuration.ApplicationSettingsGroup, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<section name="WindowsFormsTestApplication1.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
</sectionGroup>
</configSections>
<applicationSettings>
<WindowsFormsTestApplication1.Properties.Settings>
<setting name="myOwnSetting" serializeAs="String">
<value>Hi there!</value>
</setting>
</WindowsFormsTestApplication1.Properties.Settings>
</applicationSettings>
</configuration>
Visual Studio автоматически создает код на C # для доступа к этому параметру (вот почему вы должны сделать это в свойствах проекта, а не через текстовый редактор) - после сохранения изменений из того же пространства имен вы можете легко прочитать его значение в приложении с помощью следующего кода:
var currentValue = Properties.Settings.Default.myOwnSetting;
Учитывая applicationSettings
в приведенном выше списке это привело бы к получению строки "Привет!" для переменной currentValue
.
Примечание что, если вы создали Моя установка для Область действия "Пользователя", затем он сохраняется в разделе с именем <userSettings>
вместо того , чтобы <applicationSettings>
, но вы все равно можете получить к нему доступ с помощью приведенной выше строки кода.
Еще одно отличие область действия "Пользователь" настройки заключаются в том, что у вас есть доступ на чтение и запись, т.е.разрешается делать следующее:
Properties.Settings.Default.myUserSetting = "Something else";
Properties.Settings.Default.Save();
Если вы попробуете то же самое с настройкой области "Приложение" myOwnSetting, это приведет к ошибке времени компиляции, сообщающей вам, что она доступна только для чтения.
Если вы повторно запустите приложение, вы заметите, что myUserSetting изменился на значение "Что-то еще", но старое значение все еще находится в app.config.Почему это так?Причина в том, что оно рассматривается как значение по умолчанию - и, как я уже говорил ранее, область "User" привязана к профилю пользователя.Как следствие, значение "Что-то еще" хранится в
C:\Documents and Settings\USERID\Local Settings\Application Data\FIRMNAME\WindowsFormsTestApplicati_Url_tdq2oylz33rzq00sxhvxucu5edw2oghw\1.0.0.0
в файле с именем User.config
, который выглядит следующим образом:
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<userSettings>
<WindowsFormsTestApplication1.Properties.Settings>
<setting name="myUserSetting" serializeAs="String">
<value>Something else</value>
</setting>
</WindowsFormsTestApplication1.Properties.Settings>
</userSettings>
</configuration>
Вы не можете точно указать путь, поскольку он создается автоматически .NET Framework, и на вашем компьютере он будет выглядеть по-другому.Но вы можете видеть, что USERID - это идентификатор пользователя Windows вашего текущего пользователя, FIRMNAME - это часть указанной вами информации о сборке, а имя сборки и версия также используются в пути.
Примечание:
Тот самый
<sectionGroup>
с<section>
объявление является обязательным, и его атрибут name должен совпадать с пространством имен.Пространство имен должно появиться в конфигурации ровно один раз, а существует только одинapplicationSettings
раздел разрешен.Как вы могли видеть в конфигурационном файле, там явно указано пространство имен (
WindowsFormsTestApplication1.Properties.Settings
).Как следствие, если вы хотите получить доступ к настройкам из кода, находящегося не в том же пространстве имен, вам может потребоваться использовать полную ссылку.Сказав это, будьте осторожны, если будете копировать весь текст целиком.<applicationSettings>...</applicationSettings>
переход из конфигурации одного приложения в другую - возможно, впоследствии вам потребуется изменить пространство имен в целевой конфигурации.Если вы используете конструктор настроек (вкладка Настройки в вашем проекте), он создаст файл с именем
Settings.Settings
(вместе сSettings.Designer.cs
для доступа к сеансам с помощью кода C #) в разделе Свойств вашего проекта.Это копия настроек, поскольку она будет сохранена в вашемWeb.config
илиApp.config
также файл (в зависимости от типа вашего проекта, только для настроек области применения - настройки области пользователя сохраняются на основе профиля пользователя).Вы можете создать дополнительные*.settings
файлы и использовать их (как описано здесь).Если вы не с помощью конструктора настроек или, если вы используете такой инструмент, как LINQPad - панель управления, Возможно, вам придется использовать другой подход.Подумайте об этом:
internal static string GetApplicationSetting(string key, string nameSpace="Properties.Settings") { string xValue=null; try { string path = AppDomain.CurrentDomain.SetupInformation.ConfigurationFile; XDocument doc = XDocument.Load(path); var xPathStr= string.IsNullOrEmpty(nameSpace) ? "//applicationSettings" : $"//applicationSettings/{nameSpace}"; var settings=doc.XPathSelectElement(xPathStr).Elements().Where( w => w.Name=="setting" && w.HasAttributes && w.Attribute("serializeAs").Value=="String" ); var setting=settings.Where(f => f.HasAttributes && f.Attribute("name").Value==key).Elements(); xValue=setting.FirstOrDefault().Value; } catch {} return xValue; }
Вы можете прочитать строковый тип
applicationSettings
рассматривая конфигурацию какXDocument
.Приведенный пример ограничен строковым типом, и вы можете получить настройку из приведенного выше примера app.config следующим образом:var value=GetApplicationSetting("myOwnSetting", "WindowsFormsTestApplication1.Properties.Settings");
Аналогично, вы можете создать аналогичную функцию Настройка GetUserSetting для значения по умолчанию<userSettings>
Раздел:Просто скопируйте приведенный выше код, переименуйте имя функции и заменитеapplicationSettings
вxPathStr
Автор:userSettings
.Для пользовательских настроек доступен метод обновления, который описан ниже здесь.Более подробную информацию о месте хранения пользовательских настроек можно найти здесь там.
Тот самый
<appSettings>
раздел в конфигурации работает по-другому, поскольку он не различает области "User" и "Application" и не поддерживает разные типы данных, только строки.Тем не менее, можно легко чтение и запись ключи/значения конфигурации.Если вас интересует код, вы можете найти его здесь (в stackoverflow).:
как прочитать / записать настройки конфигурации AppSettingsЕсли вы не уверены, следует ли вам использовать
AppSettings
илиapplicationSettings
, тогда читать это прежде чем ты решишь это.
Другие советы
Как вы создавали настройки?Используете дизайнер настроек VS?Если это так, он должен создать вам строго типизированный класс для доступа к ним.Доступ к этому обычно осуществляется с помощью Properties.Settings.Default.SettingName
Я думаю, что предпочтительнее использовать applicationSettings, а не appSettings, но настройки приложения доступны только для чтения во время выполнения, т. е. вы не можете создавать их из своего кода, но я считаю, что можно создавать и добавлять appSettings во время выполнения. Я задал вопрос о разнице
вы можете найти дополнительную информацию из MSDN
//retrive the current assembly directory
private static string AssemblyDirectory()
{
string codeBase = Assembly.GetExecutingAssembly().CodeBase;
UriBuilder uri = new UriBuilder(codeBase);
string path = Uri.UnescapeDataString(uri.Path);
return Path.GetDirectoryName(path);
}
//return the value from aplicationSetting according to the given key
//appSettingSection is the your configuration section as declare in your web.config
public static string GetApplicationSettingValue(string appSettingSection,string key)
{
//get web.config path
string configPath = new System.IO.DirectoryInfo(AssemblyDirectory()).Parent.FullName + "\\web.config";
System.IO.FileInfo FileInfo = new System.IO.FileInfo(configPath);
if (!FileInfo.Exists)
{
throw new Exception("Missing config file");
}
//load config file into xml document
var XmlConfig = new System.Xml.XmlDocument();
XmlConfig.Load(FileInfo.FullName);
//override xml document and return the value of the key under applicationSettings
foreach (System.Xml.XmlNode node in XmlConfig["configuration"] ["applicationSettings"]appSettingSection])
{
if (node.Name == "setting")
{
if (node.Attributes.GetNamedItem("name").Value == key)
{
return node.FirstChild.InnerXml.ToString();
}
}
}
return "";
}