2013-06-27 19 views
5

walczę z konfiguracją i ustawianie klas w .NET 2.0AppSettings z plików niestandardowych

Jeśli następuje contaned w pliku o nazwie app.config

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

wiem, że mogę wejść do AppSetting przez

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

Jednak jeśli plik nosi nazwę app1.config (lub inną nazwę), nie mogę uzyskać dostępu do aplikacji Konfigurowanie. Tak długo, jak rozumiem, z ConfigurationManager.OpenExeConfiguration powinienem czytać niestandardowe pliki ustawień konfiguracji.

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

Jednak conf.AppSettings.Settings["Foo"] zwraca pusty ciąg znaków.

Próbowałem również następujący kod, ale bez powodzenia

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

Jak odczytać ustawienia z pliku o nazwie nie app.config?

+0

'ConfigurationManager.OpenExeConfiguration (@" .. \ .. \ app1.config ");' nie działa? – aiapatag

+0

Punktem jest conf.AppSettings.Settings ["Foo"] zwraca pusty ciąg znaków. Spodziewałem się "Hello World!" – user1813

+1

OpenExeConfiguration pobiera Ścieżkę pliku wykonywalnego (exe) jako parametru, a nie ścieżkę do pliku ustawień – Arie

Odpowiedz

1

Powinieneś użyć pliku z ustawieniami, wygodniejszego w użyciu, posiadającego metody zapisywania i ładowania i możesz nazwać to, co chcesz. Na przykład. Moje ustawienia Plik nazywa się „EditorSettings.settings” i uzyskać dostęp do jego właściwości tak:

MyNamespace.MyProject.EditorSettings.Default.MyProperty1 
+1

Zgadzam się. Z drugiej strony chciałbym zrozumieć, dlaczego conf.AppSettings.Settings ["Foo"] nie zwraca "Hello World!" – user1813

+0

Prawdopodobnie musisz umieścić wartość w podwęźle wartości: Witaj, świecie! SlapY

3

Stworzyłem niestandardowy plik myCustomConfiguration i zmienia swoje właściwości Kopiuj do wyjścia Dyrektorium do prawdziwej

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

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

Chociaż to działa, ale szukam również lepszego podejścia.