2013-02-19 4 views
10

Hier zu bekommen ist die Idee, die ich hatte:Wie alle Abschnitte mit Namen in der sectionapplication in .Net 2.0

Ich möchte eine kleine ausführbare Datei eine app.config-Datei mit mehreren Abschnitten haben, die unter dem section liegen " applicationSettings "(nicht" appSettings ", ich muss nicht in die Datei schreiben). Jeder Abschnitt würde einen Namen haben, der einem Modul entspricht, das geladen werden sollte, wenn es gesetzt ist.

Hier ist ein Beispiel:

<configuration> 
    <configSections> 
     <sectionGroup name="applicationSettings" type="System.Configuration.ApplicationSettingsGroup, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" > 
     <section name="Executable" type="System.Configuration.ClientSettingsSection, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" /> 
     <section name="FirstModule" type="System.Configuration.ClientSettingsSection, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" /> 
     </sectionGroup> 
    </configSections> 
    <applicationSettings> 
     <Executable> 
     <setting name="MyFirstSetting" serializeAs="String"> 
      <value>My awesome feature setting</value> 
     </setting> 
     </Executable> 
     <FirstModule path="path to the modules assembly"> 
     <setting name="ImportantSettingToTheModule" serializeAs="String"> 
      <value>Some important string</value> 
     </setting> 
     </FirstModule> 
    </applicationSettings> 
    </configuration> 

Nun, wenn ich den FirstModule Abschnitt definieren, ich möchte, dass meine Anwendung ihre Montage zu laden. Wenn der Abschnitt nicht definiert ist, sollte das Modul nicht geladen werden. Dies sollte nicht nur für ein Modul, sondern auch für eine noch nicht definierte Anzahl gelten.

Also muss ich im Grunde über die definierten Abschnitte zur Laufzeit herausfinden. Wie würde ich das tun?

Zusätzlich möchte ich, dass dies eine portable ausführbare Datei wird (= es muss auch auf Mono laufen), die abwärtskompatibel zu .NET 2.0 ist.

Es könnte interessant sein, sich das Projekt auf GitHub anzusehen (derzeit unter this commit).

Antwort

21

Werfen Sie einen Blick auf die Funktion ConfigurationManager.OpenExeConfiguration, um Ihre Konfigurationsdatei zu laden.

Dann auf die System.Configuration.Configuration Klasse, die Sie von ConfigurationManager.OpenExeConfiguration zurück erhalten Sie wollen die SectionGroups Eigenschaft betrachten. Das wird eine ConfigurationSectionGroupCollection zurückgeben, in der Sie den applicationSettings Abschnitt finden.

Im ConfigurationSectionGroupCollection wird es eine Sections Eigenschaft sein, die die Executable und FirstModuleConfigurationSection Objekte enthält.

var config = ConfigurationManager.OpenExeConfiguration(pathToExecutable); 
var applicationSettingSectionGroup = config.SectionGroups["applicationSettings"]; 
var executableSection = applicationSettingSectionGroup.Sections["Executable"]; 
var firstModuleSection = applicationSettingSectionGroup.Sections["FirstModule"]; 

Sie werden für null nach Erhalt des ConfigurationSectionGroupCollection Objekt oder ConfigurationSection Objekte überprüfen möchten. Wenn sie null sind, sind sie in der Konfigurationsdatei nicht vorhanden.

können Sie erhalten auch die Abschnitte von ConfigurationManager.GetSection

var executableSection = (ClientSettingsSection)ConfigurationManager 
    .GetSection("applicationSettings/Executable"); 
var firstModuleSection = (ClientSettingsSection)ConfigurationManager 
    .GetSection("applicationSettings/FirstModule"); 

wieder verwenden, wenn die Objekte sind null sie existieren nicht in der Konfigurationsdatei.

Um eine Liste aller Abschnittsnamen und Gruppen erhalten Sie tun können:

var config = ConfigurationManager.OpenExeConfiguration(pathToExecutable); 
var names = new List<string>(); 
foreach (ConfigurationSectionGroup csg in config.SectionGroups) 
    names.AddRange(GetNames(csg)); 

foreach (ConfigurationSection cs in config.Sections) 
    names.Add(cs.SectionInformation.SectionName); 

private static List<string> GetNames(ConfigurationSectionGroup configSectionGroup) 
{ 
    var names = new List<string>(); 

    foreach (ConfigurationSectionGroup csg in configSectionGroup.SectionGroups) 
     names.AddRange(GetNames(csg)); 

    foreach(ConfigurationSection cs in configSectionGroup.Sections) 
     names.Add(configSectionGroup.SectionGroupName + "/" + cs.SectionInformation.SectionName); 

    return names; 
} 
+0

, dass Sie sehr viel sehr geholfen, danke. Ich würde zwei Upvotes geben, um direkt auf mein Beispiel zu verweisen, aber ich kann nicht ... :( – HaMster

+0

Kein Problem, ich bin froh, Ihnen helfen zu können. Vielleicht möchten Sie meine letzte Bearbeitung sehen. Ich habe ein paar Informationen zu 'ConfigurationManager.GetSection' hinzugefügt. Wenn Sie keine weiteren Aktionen in der Konfigurationsdatei ausführen müssen, stellen Sie normalerweise die bevorzugte Methode für den Zugriff auf die Konfigurationsdatei dar. –

+6

Konfiguration config = ConfigurationManager.OpenExeConfiguration (ConfigurationUserLevel.None) - Dies öffnet die Konfiguration für die aktuelle Datei app. keine Notwendigkeit zu wissen exe Pfad. – timothy