2013-06-27 13 views
5

sto lottando con la configurazione e l'impostazione classi in .NET 2.0AppSettings da file personalizzati

Se è contaned in un file chiamato app.config

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

so di poter accedere al appSetting dal

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

Tuttavia se il file si chiama app1.config (o qualsiasi altro nome) non riesco ad accedere all'applicazione Impostazioni. Finché ho capito, con ConfigurationManager.OpenExeConfiguration dovrei leggere i file di configurazione config personalizzati.

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

Tuttavia, conf.AppSettings.Settings["Foo"] restituisce una stringa vuota.

Ho anche provato il seguente codice, ma senza successo

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

Come leggere l'impostazione da un file non chiamato app.config?

+0

'ConfigurationManager.OpenExeConfiguration (@" .. \ .. \ app1.config ");' non funziona? – aiapatag

+0

Il punto è conf.AppSettings.Settings ["Foo"] restituisce una stringa vuota. Mi aspettavo "Ciao mondo!" – user1813

+1

OpenExeConfiguration ottiene Il percorso del file eseguibile (exe) come parametro, non il percorso del file delle impostazioni – Arie

risposta

1

Si dovrebbe fare uso di un file di impostazioni, è molto più comodo da usare, ha metodi di salvataggio e caricamento e puoi chiamarlo come vuoi. Per esempio. Le mie impostazioni-file si chiama "EditorSettings.settings" e accedere alle sue proprietà come questa:

MyNamespace.MyProject.EditorSettings.Default.MyProperty1 
+1

Accetto. D'altra parte mi piacerebbe capire perché conf.AppSettings.Settings ["Foo"] non restituisce "Hello World!" – user1813

+0

Probabilmente è necessario inserire il valore all'interno di un subnodo di valore: Hello World! SlapY

3

ho creato file personalizzato myCustomConfiguration e cambia la sua proprietà Copia nella directory di output a vero

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

Nel file di 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; 
} 

Anche se funziona, ma sto anche cercando un approccio migliore.

Problemi correlati