2013-06-27 4 views
5

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

Если следующее contaned в файле app.config

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

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

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

Однако, если файл называется app1.config (или любым другим именем), я не могу получить доступ к приложению. До тех пор, как я понимаю, с 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?

+0

'ConfigurationManager.OpenExeConfiguration (@" .. \ .. \ app1.config ");' does not work? – aiapatag

+0

Точка conf.AppSettings.Settings ["Foo"] возвращает пустую строку. Я ожидал «Hello World!». – user1813

+1

OpenExeConfiguration получает путь к исполняемому файлу (exe) в качестве параметра, а не к файлу настроек – Arie

ответ

1

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

MyNamespace.MyProject.EditorSettings.Default.MyProperty1 
+1

Согласен. С другой стороны, я хотел бы понять, почему conf.AppSettings.Settings ["Foo"] не возвращает «Hello World!». – user1813

+0

Возможно, вам нужно поместить значение в поднабор значения: <параметр name = "MyString" serializeAs = "String"> Hello World! SlapY

3

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

<?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; 
} 

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