Как получить ApplicationSettings из загруженного файла App.config?
Можно ли получить доступ к значениям из раздела applicationSettings загруженного файла app.config?
Я нашел пример, как мне получить appSettings, но я не могу узнать, как получить доступ к applicationSettings таким образом.
3 ответа
Настройки приложения доступны только для чтения во время выполнения. Вы можете установить / изменить их либо с помощью текстового редактора в файле app.config напрямую, но рекомендуется открыть свойства проекта в Visual Studio и выбрать вкладку "Настройки". Важно установить правильную область:
- Если настройки применяются ко всему приложению (для всех пользователей), выберите "Приложение" в качестве области действия.
- Если у каждого пользователя должны быть индивидуальные настройки (привязанные к профилю пользователя), выберите "Пользователь".
Например, если вы создаете myOwnSetting в своем проекте WindowsFormsTestApplication1 следующим образом:
он добавит следующее в файл 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
,
Обратите внимание, что если вы создали myOwnSetting для области "Пользователь", то он сохраняется в разделе с именем <userSettings>
вместо <applicationSettings>
, но вы все равно можете получить к нему доступ с помощью строки кода выше.
Другое отличие настроек "User" в области видимости состоит в том, что у вас есть права на чтение и запись, то есть разрешено делать следующее:
Properties.Settings.Default.myUserSetting = "Something else";
Properties.Settings.Default.Save();
Если вы попытаетесь сделать то же самое с настройкой области приложения "myOwnSetting", это приведет к ошибке времени компиляции, сообщающей, что она доступна только для чтения.
Если вы перезапустите приложение, вы заметите, что myUserSetting изменилось на значение "Something else", но старое значение все еще находится в app.config. Почему это так? Причина в том, что оно рассматривается как значение по умолчанию - и, как я уже говорил, область действия "Пользователь" привязана к профилю пользователя. Как следствие, значение "Что-то еще" сохраняется в
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# код) в разделе Properties вашего проекта. Это копия настроек, так как она будет сохранена в вашем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>
Раздел в конфигурации работает по-разному, так как он не различает область действия "Пользователь" и "Приложение" и не поддерживает разные типы данных, только строки. Тем не менее, можно легко читать и записывать конфигурационные ключи / значения. Если вы заинтересованы в коде, вы можете найти его здесь (на stackru):
как читать / писать настройки конфигурации 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 "";
}