Как получить ApplicationSettings из загруженного приложения.файл config?
можно ли получить доступ к значениям от applicationsettings-это раздел загруженного приложения.файл config?
Я нашел пример как мне получить параметр appsettings, но я не могу узнать, как получить доступ applicationsettings-это этот путь.
3 ответов
на applicationsettings-это are только для чтения во время выполнения. Вы можете установить / изменить их либо с помощью текстового редактора в приложении.конфигурационный файл напрямую, но рекомендуется открыть свойства проекта в Visual Studio и выбрать вкладку" Настройки". Важно установить правильный объем:
- если настройки применяются ко всему приложению (для всех пользователей), выберите "приложения" как сфера.
- если каждый пользователь должен иметь индивидуальные настройки (привязаны к профилю пользователя), затем выберите "пользователь"
например, если вы создаете myOwnSetting в проекте WindowsFormsTestApplication1 следующим образом:
он добавит следующее в приложение приложения.конфигурационный файл:
<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>
, но вы все еще можете получить к нему доступ с этой строки кода.
еще одно отличие объем "пользователя" настройки - это то, что у вас есть доступ для чтения и записи, т. е. разрешено делать следующее:
Properties.Settings.Default.myUserSetting = "Something else";
Properties.Settings.Default.Save();
если вы попробуете то же самое с областью "Application", устанавливающей myOwnSetting, это приведет к ошибке компиляции, сообщающей вам, что она доступна только для чтения.
если вы повторно запустите приложение, вы заметите, что myUserSetting изменился на значение "что - то еще" - но старое значение все еще находится в приложении.конфиг. Почему это так? Причина в том, что он рассматривается как значение по умолчанию - и, как я уже говорил ранее, область "пользователь" привязана к профилю пользователя. Как следствие, значение "что-то еще" сохраняется в
C:\Documents and Settings\USERID\Local Settings\Application Data\FIRMNAME\WindowsFormsTestApplicati_Url_tdq2oylz33rzq00sxhvxucu5edw2oghw.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 должен соответствовать пространству имен. Пространство имен должно отображаться ровно один раз в конфигурации, и существует только один допущено.как вы могли видеть в файле конфигурации, пространство имен явно упоминается там (
WindowsFormsTestApplication1.Properties.Settings
). Как следствие, если вы хотите получить доступ к настройкам из кода, не находящегося в том же пространстве имен, вам может потребоваться использовать полную ссылку. Сказав это, будьте осторожны, если вы копируете весь<applicationSettings>...</applicationSettings>
раздел из конфигурации одного приложения в другое - вам может потребоваться изменить пространство имен в целевой конфигурации впоследствии.если вы используете конструктор настроек (вкладка настройки в вашем проекте), это создаст файл с именем
Settings.Settings
(вместе сSettings.Designer.cs
для доступа к sessings через код 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
. Приведенный пример ограничен типом string и вы можете получить настройки из приложения.пример конфигурации выше следующим образом:var value=GetApplicationSetting("myOwnSetting", "WindowsFormsTestApplication1.Properties.Settings");
Аналогично, вы можете создать аналогичную функцию GetUserSetting по умолчанию<userSettings>
раздел: просто скопируйте код выше, переименуйте имя функции и заменитеapplicationSettings
наxPathStr
byuserSettings
. для пользовательских настроек доступен метод обновления, который описан здесь. Подробнее о месте, где пользовательские настройки хранятся можно найти здесь.
на
<appSettings>
раздел в конфигурации работает по-разному, так как он не различает область "Пользователь" и "приложение" и не поддерживает разные типы данных, только строки. Тем не менее, это можно легко читать и писать настройки ключей/значений. Если вас интересует код, вы можете найти его здесь (on stackoverflow):
как читать / писать настройки конфигурации appSettingsесли вы не уверены, следует ли вам использовать
AppSettings
илиapplicationSettings
, потом читать это прежде чем вы решите его.
Как вы сделали настройки? Использование конструктора настроек VS? Если это так, он должен создать вам строго типизированный класс для доступа к ним. Это обычно доступно с помощью Properties.Settings.Default.SettingName
Я думаю, что предпочтительнее использовать applicationSettings, а не appSettings, но настройки приложения читаются только во время выполнения, т. е. вы не можете создать их из своего кода, но я считаю, что можно создавать и добавлять appSettings во время выполнения. Я задал вопрос о разница
вы можете найти более подробную информацию из msdn
Вы можете загрузить файл конфигурации в XmlDocument и повторить applicationSettings из объекта dom . Вот пример, который я нашел, чтобы загрузить файл конфигурации в объект dom :
//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 "";
}