Вопрос

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

Я нашел пример Как мне восстановить Настройки приложений, но я не могу узнать, как получить доступ Настройки приложений сюда.

Это было полезно?

Решение

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

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

Например, если вы создадите Моя установка в вашем проекте WindowsFormsTestApplication1 Приложение для тестирования Windowsformstest следующим образом:

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.

Примечание что, если вы создали Моя установка для Область действия "Пользователя", затем он сохраняется в разделе с именем <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

Вы могли бы загрузить файл конфигурации в 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 "";
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top