AppSettings из пользовательских файлов

Я борюсь с конфигурацией и настройкой классов в .NET 2.0.

Если следующее содержится в файле с именем app.config

<config>
<appSettings>
<add key="Foo" value="Hello World!"/>
</appSettings>
</config>

Я знаю, что могу получить доступ к appSetting,

// this returns "Hello World!"
ConfigurationManager.AppSettings["Foo"]

Однако, если файл называется app1.config (или любое другое имя), я не могу получить доступ к файлу appSetting. Насколько я понимаю, с ConfigurationManager.OpenExeConfiguration я должен читать файлы настроек пользовательской конфигурации.

Configuration conf = ConfigurationManager.OpenExeConfiguration(@"..\..\app1.config");
// this prints an empty string.
Console.WriteLine(conf.AppSettings.Settings["Foo"]);

Однако conf.AppSettings.Settings["Foo"] возвращает пустую строку.

Я также пробовал следующий код, но безуспешно

ExeConfigurationFileMap exeFileMap = new ExeConfigurationFileMap();
exeFileMap.ExeConfigFilename = System.IO.Directory.GetCurrentDirectory()
                                                        + "\\App1.config";
Configuration myConf = ConfigurationManager.OpenMappedExeConfiguration
                                 (exeFileMap, ConfigurationUserLevel.None);
// returns empty string as well
Console.WriteLine(myConf.AppSettings.Settings["Foo"]);

Как прочитать настройку из файла, который не называется app.config?


person user1813    schedule 27.06.2013    source источник
comment
ConfigurationManager.OpenExeConfiguration(@"..\..\app1.config"); не работает?   -  person aiapatag    schedule 27.06.2013
comment
Дело в том, что conf.AppSettings.Settings[Foo] возвращает пустую строку. Я ожидал привет мир!   -  person user1813    schedule 27.06.2013
comment
OpenExeConfiguration получает в качестве параметра путь к исполняемому (exe) файлу, а не путь к файлу настроек   -  person Arie    schedule 27.06.2013
comment
Да, я также пытался использовать ExeConfigurationFileMap, но все равно не работает.   -  person user1813    schedule 27.06.2013
comment
Привет Чувак! У меня такая же проблема. Вы нашли способ заставить его работать?   -  person Yoiku    schedule 17.03.2016
comment
Корневой элемент вашего файла должен быть ‹configuration›.   -  person Adam    schedule 20.11.2017


Ответы (2)


Я создал пользовательский файл myCustomConfiguration и изменил его свойство Копировать в выходной каталог на true.

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <appSettings>
    <add key="Foo" value="Hello World!"/>
  </appSettings>
</configuration>

В файле CS

static void Main(string[] args)
{
    var filePath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "myCustomConfiguration.config");
    Dictionary<string, string> dictionary = GetNameValueCollectionSection("appSettings", filePath);

    //To get your key do dictionary["Foo"]
            Console.WriteLine(dictionary["Foo"]);

    Console.ReadLine();
}

private static Dictionary<string, string> GetNameValueCollectionSection(string section, string filePath)
{
    var xDoc = new XmlDocument();
    var nameValueColl = new Dictionary<string, string>();

    var configFileMap = new ExeConfigurationFileMap { ExeConfigFilename = filePath };
    Configuration config = ConfigurationManager.OpenMappedExeConfiguration(configFileMap, ConfigurationUserLevel.None);

    string xml = config.GetSection(section).SectionInformation.GetRawXml();
    xDoc.LoadXml(xml);
    XmlNode xList = xDoc.ChildNodes[0];
    foreach (XmlNode xNodo in xList.Cast<XmlNode>().Where(xNodo => xNodo.Attributes != null))
    {
        nameValueColl.Add(xNodo.Attributes[0].Value, xNodo.Attributes[1].Value);
    }

    return nameValueColl;
}

Хотя это работает, но я также ищу лучший подход.

person Satpal    schedule 27.06.2013

Вы должны использовать файл настроек, он более удобен в использовании, имеет методы сохранения и загрузки, и вы можете назвать его как хотите. Например. мой файл настроек называется «EditorSettings.settings», и я получаю доступ к его свойствам следующим образом:

MyNamespace.MyProject.EditorSettings.Default.MyProperty1
person Hexo    schedule 27.06.2013
comment
Я согласен. С другой стороны, я хотел бы понять, почему conf.AppSettings.Settings[Foo] не возвращает Hello World! - person user1813; 27.06.2013
comment
Вероятно, вам нужно поместить значение в подузел значения: ‹setting name=MyString serializeAs=String›‹value›Hello World!‹/value›‹/setting› - person Hexo; 27.06.2013