2009-08-05 7 views
5

ich meine Assembly Konfiguration wie dieser Zugriff:einen String aus AppSettings durch den Konfigurationsmanager Erste

ExeConfigurationFileMap map = new ExeConfigurationFileMap(); 
map.ExeConfigFilename = Assembly.GetExecutingAssembly().Location + ".config"; 
Configuration conf = ConfigurationManager.OpenMappedExeConfiguration(map, ConfigurationUserLevel.None); 
AppSettingsSection appSettings = conf.AppSettings; 

Meine .config-Datei enthält einen Abschnitt, wie dieses ich die erfolgreich lesen kann

<configSections> 
    <sectionGroup name="applicationSettings" type="System.Configuration.ApplicationSettingsGroup, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" > 
     <section name="CsDll.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" /> 
    </sectionGroup> 
</configSections> 
<connectionStrings> 
    <add name="CsDll.Properties.Settings.SabreCAD" connectionString="A Connection string." /> 
    <add name="CsDll.Properties.Settings.StpParts" connectionString="Another connection string" /> 
</connectionStrings> 
<applicationSettings> 
     <CsDll.Properties.Settings> 
      <setting name="StpInsertSearchPath" serializeAs="Xml"> 
       <value> 
        <ArrayOfString xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
         xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
         <string>A string</string> 
         <string>Another string in the collection</string> 

Verbindungszeichenfolgen einschließlich Änderungen, wenn ich die .config-Datei bearbeite. Ich weiß, dass ich mit der richtigen Datei verbunden bin. Aber ich finde diese String-Sammlung nicht innerhalb des appSettings-Objekts. Es ist nicht in der .Settings KeyValueConfigurationCollection. Wo finde ich meine String-Sammlung?

Antwort

6

sollten Sie die Elemente in der Sammlung zugreifen werden, um diese einfache Syntax

foreach (string s in CsDll.Properties.Settings.Default.StpInsertSearchPath) 
{ 
    Console.WriteLine(s); 
} 

EDIT:

Der folgende Code sollte den Trick

ExeConfigurationFileMap map = new ExeConfigurationFileMap(); 
map.ExeConfigFilename = Assembly.GetExecutingAssembly().Location + ".config"; 
Configuration conf = ConfigurationManager.OpenMappedExeConfiguration(map, ConfigurationUserLevel.None); 
ConfigurationSectionGroup appSettingsGroup = conf.GetSectionGroup("applicationSettings"); 
ClientSettingsSection clientSettings = (ClientSettingsSection) appSettingsGroup.Sections["CsDll.Properties.Settings"]; 
ConfigurationElement element = clientSettings.Settings.Get("StpInsertSearchPath"); 
string xml = ((SettingElement)element).Value.ValueXml.InnerXml; 
XmlSerializer xs = new XmlSerializer(typeof(string[])); 
string[] strings = (string[])xs.Deserialize(new XmlTextReader(xml, XmlNodeType.Element, null)); 
foreach (string s in strings) 
{ 
    Console.WriteLine(s); 
} 

Es kann sein, ein kürzerer Weg tun , aber das funktioniert für mich.

+0

OK auf die Notwendigkeit, so viel zu erreichen. Ich kann das String-Array auf diese Weise lesen. Die Zeichenfolgen stammen jedoch aus dem Standard, der in die Assembly kompiliert wurde. Ich muss Strings in dieser Sammlung hinzufügen, entfernen und ändern können, nachdem die Assembly bereitgestellt wurde. Die .Properties.Settings.Default nimmt keine Änderungen an der .config-Datei auf. Hatte das gleiche Problem mit den Verbindungszeichenfolgen, bis ich den ConfigurationManager durchging. –

+0

Sie müssen wahrscheinlich auf die Methode des ConfigurationManagers zugreifen: ConfigurationManager.GetSection ("applicationSettings"); , die das Objekt, für das Sie analysieren möchten, zurückgeben soll – jkelley

+0

ConfigurationManager.GetSection ("applicationSettings") gibt null zurück –

1

Die Verbindungszeichenfolgen befinden sich normalerweise innerhalb der ConnectionStrings-Eigenschaft des Konfigurationsmanagers. Sie sollten in der Lage sein, auf eine viel einfachere Weise durch seine statische Methode zuzugreifen.

string myConnectionString = ConfigurationManager.ConnectionStrings["connectioStringName"]; 

Ich glaube, Sie sollten den Tag „AppSettings“ statt „Application“ in der .config-Datei verwenden, um die Konfigurationsmanager zu ermöglichen, die AppSettings Eigenschaft zuzugreifen durch.

Ich weiß nicht genug darüber, wie ConfigurationManager funktioniert, um sicherzustellen, dass dies Ihr Problem löst, aber das Umbenennen und Entfernen dieser benutzerdefinierten Abschnittsgruppe sollte AppSettings ordnungsgemäß funktionieren lassen.

bearbeiten Ja, scheint es, dass AppSettings Eigenschaft Configuration den Abschnitt in der .config-Datei mit dem Namen zugreift.

2

AppSettings und ConnectionStrings sind beide Eigenschaften, die direkt im ConfigurationManager verfügbar sind.

jedoch application und Usersettings, die den bekannten Settings.settings entspricht Sie in den VS-Einstellungen Designer bearbeiten können, ist nicht so leicht zu bekommen. AppSettings ist nicht das gleiche wie applicationSettings die in einem ganz anderen Abschnitt der Konfigurationsdatei im Einsatz ist.

Sie müssen den Bergbau Ansatz oben oder eine Variante verwenden bei application und Usersettings zu bekommen. Außerdem werden die applicationSettings nur beim nächsten Start der Anwendung aktualisiert, wenn Sie sogar in der Lage sind, sie überhaupt zur Laufzeit zu schreiben.

Zum Beispiel (von anderswo abgekupfert - danke):

public static string ReadSetting(string sectionGroupName, string sectionName, string settingName, Configuration config = null) 
    { 
     if (config == null) 
      config = SharedConfigSettings; 
     // Get sectionGroup 
     var sectionGroup = 
      config.GetSectionGroup(sectionGroupName); 

     // Get section 
     var section = 
      (ClientSettingsSection)sectionGroup.Sections.Get(sectionName); 
     // Get setting 
     var setting = section.Settings.Get(settingName); 
     // Read setting value 
     return setting.Value.ValueXml.InnerText; 
    } 

und für ein anderes Beispiel (adaoted von vielen Beispielen - vielen Dank für die Welt):

///<summary> 
    /// return the applicationSettings section 
    ///</summary> 
    ///<returns></returns> 
    public static ClientSettingsSection GetSettingsSection(ConfigurationSectionGroup group, string clientSectionName) 
    { 
     return (ClientSettingsSection)group.Sections[clientSectionName]; 
    } 


    ///<summary> 
    /// return the section settings collection 
    ///</summary> 
    ///<returns></returns> 
    public static System.Configuration.SettingElementCollection GetSettingsCollection(ClientSettingsSection section) 
    { 
     return section.Settings; 
    } 

    ///<summary> 
    /// return the connectionStrings section collection 
    ///</summary> 
    ///<returns></returns> 
    public static System.Configuration.SettingElementCollection ConnectionStringsCollection() 
    { 
     return ((ClientSettingsSection)SharedConfigSettings.GetSection("connectionStrings")).Settings; 
    } 

    ///<summary> 
    /// A collection of all the UserSettings in a SettingElementCollection 
    ///</summary> 
    ///<returns></returns> 
    public static SettingElementCollection UserSettings() 
    { 
     return 
      GetSettingsCollection(GetSettingsSection(GetSettingsSectionGroup(@"userSettings"), 
                @"MyAssembly.Properties.Settings")); 
    } 

    ///<summary> 
    /// A collection of all the ApplicationSettings in a SettingElementCollection 
    ///</summary> 
    ///<returns></returns> 
    public static SettingElementCollection ApplicationSettings() 
    { 
     return 
      GetSettingsCollection(GetSettingsSection(GetSettingsSectionGroup(@"applicationSettings"), 
                @"MyAssembly.Properties.Settings")); 
    } 

Dann Sie leider müssen sich weiterhin mit den SettingElement-Objekten beschäftigen, die sich in den Einstellungen in diesen Abschnitten befinden. Jeder muss für den Eigenschaftstyp deserialisiert werden, es sei denn, es handelt sich um eine Zeichenfolge, z. für einen application SettingElement (eine, die nicht zur Laufzeit dynamisch aktualisiert werden kann):

(exerciser)

var y = GetSettingsSection(GetSettingsSectionGroup(@"applicationSettings"), @"MyAssembly.Properties.Settings"); 
var c = (y.Settings.Cast<SettingElement>().FirstOrDefault(s => s.Name == "WellKnownDirectories").Value).ValueXml 
       .InnerXml; // the setting as Xml 
var xs = new XmlSerializer(typeof(string[])); 
var strings = (string[])xs.Deserialize(new XmlTextReader(c, XmlNodeType.Element, null)); 

foreach (string s in strings) 
     { 
      Console.WriteLine(s); 
     } 

für eine Zeichenfolge Eigenschaft es ist einfacher (Dieses Beispiel ist im Wesentlichen mit dem ersten über redundant):

var s = (y.Settings.Cast<SettingElement>().FirstOrDefault(s => s.Name == "MyUserSettingName").Value).ValueXml 
       .InnerText 

Alle diese Beispiele fiedled mit ApplicationSettings. Der gleiche Ansatz kann mit userSettings mit dem Hinzufügen von möglicherweise einigen Speichermethoden usw. arbeiten, und Sie müssen (mehr oder weniger) verfolgen, welche der vielen Konfigurationsdateien tatsächlich im Spiel sind - Main, Roaming oder Local .

Warum mache ich das? Da zwei verwandte Anwendungen und eine gemeinsame Klassenbibliothek (oder Bibliotheken) dieselben Einstellungen verwenden müssen, die einer der Anwendungen gehören, in denen die Einstellungen visuell verwaltet werden. Hat jemand das besser gelöst?

Danke.

2

wenn es ein String Sie aus den Einstellungen

var strings = (StringCollection) Properties.Settings.Default["StpInsertSearchPath"]; 

zu extrahieren versuchen wird für XmlSerializer

Verwandte Themen