Как получить ApplicationSettings из загруженного файла App.config? - PullRequest
11 голосов
/ 20 января 2010

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

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

Ответы [ 3 ]

12 голосов
/ 14 марта 2012

Настройки приложения доступны только для чтения во время выполнения. Вы можете установить / изменить их либо с помощью текстового редактора в файле 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>, но вы все равно можете получить к нему доступ с помощью строки кода выше.

Еще одно отличие настроек «Пользователь» состоит в том, что у вас есть доступ для чтения и записи, т. Е. Разрешено делать следующее:

        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 # ) в разделе «Свойства» вашего проекта. Это копия настроек, так как она также будет сохранена в вашем файле 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> в конфигурации работает по-разному, поскольку он не различает область действия «Пользователь» и «Приложение» и не поддерживает разные типы данных, а только строки. Тем не менее, можно легко читать и записывать ключи / значения конфигурации. Если вы заинтересованы в коде, вы можете найти его здесь (на stackoverflow):
    как читать / записывать настройки конфигурации appSettings

  • Если вы не уверены, следует ли вам использовать AppSettings или applicationSettings, тогда прочитайте это , прежде чем принять решение.

4 голосов
/ 20 января 2010

Как вы создали настройки? Используя конструктор настроек VS? Если это так, он должен создать вам строго типизированный класс для доступа к ним с помощью. Обычно к этому обращаются, используя Properties.Settings.Default.SettingName

Я думаю, что предпочтительнее использовать applicationSettings, а не appSettings, но настройки приложения доступны только для чтения во время выполнения, то есть вы не можете создавать их из своего кода, но я считаю, что можно создавать и добавлять appSettings во время выполнения Я задал вопрос о разнице

Вы можете найти больше информации из MSDN

3 голосов
/ 16 августа 2012
Вы можете загрузить файл конфигурации в XmlDocument и получить настройки приложения. от объекта Дом. Вот пример, который я нашел для загрузки файла конфигурации в объект 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 "";
}
...