Как получить ApplicationSettings из загруженного файла App.config?

Можно ли получить доступ к значениям из раздела applicationSettings загруженного файла app.config?

Я нашел пример, как мне получить appSettings, но я не могу узнать, как получить доступ к applicationSettings таким образом.

3 ответа

Решение

Настройки приложения доступны только для чтения во время выполнения. Вы можете установить / изменить их либо с помощью текстового редактора в файле app.config напрямую, но рекомендуется открыть свойства проекта в Visual Studio и выбрать вкладку "Настройки". Важно установить правильную область:

  • Если настройки применяются ко всему приложению (для всех пользователей), выберите "Приложение" в качестве области действия.
  • Если у каждого пользователя должны быть индивидуальные настройки (привязанные к профилю пользователя), выберите "Пользователь".

Например, если вы создаете myOwnSetting в своем проекте WindowsFormsTestApplication1 следующим образом:

myOwnSetting

он добавит следующее в файл 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

Вы можете загрузить файл конфигурации в 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 "";
}
Другие вопросы по тегам