2013-06-27 7 views
5

ich mit der Konfiguration habe Schwierigkeiten und Klassen in .NET 2.0AppSettings von benutzerdefinierten Dateien

Einstellung Wenn die folgenden in einer Datei namens app.config contaned wird

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

Ich weiß, dass ich das appSetting von

zugreifen kann

Wenn die Datei jedoch app1.config (oder einen anderen Namen) heißt, kann ich nicht auf die AppSetting zugreifen. Solange ich verstehe, mit ConfigurationManager.OpenExeConfiguration sollte ich benutzerdefinierte Konfigurationsdateien lesen.

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

conf.AppSettings.Settings["Foo"] gibt jedoch eine leere Zeichenfolge zurück.

Ich habe auch versucht, den folgenden Code aber keinen Erfolg

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"]); 

Wie aus einer Datei app.config nicht aufgerufen lesen Einstellung?

+0

'ConfigurationManager.OpenExeConfiguration (@" .. \ .. \ app1.config ");' funktioniert nicht? – aiapatag

+0

Der Punkt ist conf.AppSettings.Settings ["Foo"] gibt eine leere Zeichenfolge zurück. Ich erwartete "Hallo Welt!" – user1813

+1

OpenExeConfiguration ruft den Pfad der ausführbaren Datei (exe) als Parameter ab, nicht den Pfad zur Einstellungsdatei – Arie

Antwort

1

Sie sollten eine Settings-Datei verwenden, es ist viel bequemer zu bedienen, hat speichern und laden Methoden und Sie können es nennen, was immer Sie wollen. Z.B. meine Einstellungen-Datei wird „EditorSettings.settings“ und ich auf seine Eigenschaften wie folgt aus:

MyNamespace.MyProject.EditorSettings.Default.MyProperty1 
+1

sein Ich stimme zu. Auf der anderen Seite würde ich gerne verstehen, warum conf.AppSettings.Settings ["Foo"] nicht "Hello World!" – user1813

+0

Sie müssen wahrscheinlich den Wert innerhalb eines Wertes Unterknoten setzen: Hallo Welt! SlapY

3

ich benutzerdefinierte Datei myCustomConfiguration erstellt und ändert seine Eigenschaft kopieren Ausgabeverzeichnis zu wahr

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

In CS Datei

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

Obwohl das funktioniert, suche ich aber auch nach einem besseren Ansatz.