Entwickler-Ecke
Sonstiges (.NET) - fremde user.config. auslesen
c#surfer - Fr 29.01.10 16:17
Titel: fremde user.config. auslesen
Hallo,
hat jemand eine Idee, wie ich die user.config (nicht app.config) eines anderen Programms auslesen kann?
Der Pfad ist bekannt. Ich mcöhte die Datei nicht mit den üblichen XML Werkzeugen auslesen, sondern hoffe, dass es eine bessere Unterstützung aus der Configuration-Ecke gibt (habe bisher leider keinen Ansatz dazu finden können).
Hintergrund: Ich habe einen Windows Dienst am laufen, der konfiguriert werden soll. Da ein Dienst keine eigene GUI hat, habe ich ein separates Konfigurations-Programm geschrieben, aber mir fehlt eine elegante Möglichkeit die Konfigurationsdaten dem Dienst zugänglich zu machen.
Vielen Dank für die Unterstützung!
JüTho - Fr 29.01.10 16:23
Hallo,
versuche es einmal mit ConfigurationManager.OpenMappedExeConfiguration, das liefert dir ein Configuration-Objekt, sodass du mit dessen Methoden weiterarbeiten kannst.
Ich glaube, das hatte ich schon einmal benutzt, als ich für mehrere verschiedene EXEs ein und dieselbe app.config verwenden wollte. Deine Situation ist dem vergleichbar.
Gruß Jürgen
c#surfer - Fr 29.01.10 17:40
Danke für die schnelle Antwort Jürgen,
ConfigurationManager.OpenMappedExeConfiguration hatte ich schonmal versucht aber leider ohne Ergebnis:
C#-Quelltext
1: 2: 3: 4: 5:
| ExeConfigurationFileMap configFile = new ExeConfigurationFileMap(); configFile.ExeConfigFilename = @"Pfad zur exe.config des fremden Programms"; configFile.LocalUserConfigFilename = @"Pfad zur user.config des fremden Programms"; configFile.RoamingUserConfigFilename = @"Pfad zur user.config des fremden Programms"; Configuration config = ConfigurationManager.OpenMappedExeConfiguration(configFile, ConfigurationUserLevel.PerUserRoamingAndLocal); |
Bei dem code bin ich nicht sicher, ob LocalUserConfigFilename und RoamingUserConfigFilename wirklich identisch sind (sein dürfen). Zudem weiss ich nicht, wie ich aus dem config Object nun an meine user.config Daten komme.
Hast du eine Idee, wie es hier weitergeht?
Danke & Grüße
c#surfer
JüTho - Fr 29.01.10 19:17
Zur Zusammenarbeit zwischen den verschiedenen Pfaden kann ich nichts sagen. Ich würde genau einen Pfad angeben, nämlich den zu der von dir gewünschten user.config. Durch config.Sections und config.SectionGroups kannst du dann auf die Daten zugreifen.
Gruß Jürgen
c#surfer - Fr 29.01.10 20:23
Zitat: |
Ich würde genau einen Pfad angeben, nämlich den zu der von dir gewünschten user.config |
Das klappt nicht, da gibt es eine exception:
Der Zeichenfolgenparameter fileMap.ExeConfigFilename darf nicht NULL oder leer sein. Parametername: fileMap.ExeConfigFilename
und wenn ich mir die ConfigurationSections mit
C#-Quelltext
1: 2:
| foreach (ConfigurationSection cs in config.Sections) Console.WriteLine(cs.SectionInformation.Name); |
ansehe
Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20:
| system.data windows system.webServer mscorlib system.data.oledb system.data.oracleclient system.data.sqlclient configProtectedData satelliteassemblies system.data.dataset startup system.data.odbc system.diagnostics runtime system.codedom system.runtime.remoting connectionStrings assemblyBinding appSettings system.windows.forms |
erinnert mich da nichts an meine user.config.
EDIT:
Inzwischen habe ich etwas gefunden, dass es sein könnte
C#-Quelltext
1: 2: 3: 4: 5: 6:
| foreach (ConfigurationSectionGroup cs in config.SectionGroups) { Console.WriteLine(cs.SectionGroupName); if (cs.SectionGroupName == "userSettings") Console.WriteLine(cs.SectionGroups.Count); } |
allerdings der count ist 0...
Grüße
c#surfer
JüTho - Sa 30.01.10 11:35
So, ich habe mal meinen alten Code herausgesucht.
Bei den Versuchen hatte ich nur ExeConfigFilename zugewiesen:
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10:
| System.Configuration.ExeConfigurationFileMap fm = new ExeConfigurationFileMap(); fm.ExeConfigFilename = ConfigurationManager.AppSettings["SettingPath"] + "\\" + ConfigurationManager.AppSettings["ConfigFile"]; Configuration config = ConfigurationManager.OpenMappedExeConfiguration (fm, ConfigurationUserLevel.None); KeyValueConfigurationCollection appStgs = config.AppSettings.Settings; foreach(KeyValueConfigurationElement elem in appStgs) MessageBox.Show( String.Format("Key {0} - Value {1}", elem.Key, elem.Value) ); |
Damit bin ich wohl nicht allzuweit gekommen und habe es stattdessen so gemacht:
C#-Quelltext
1: 2: 3: 4: 5: 6: 7:
| Configuration config = ConfigurationManager.OpenExeConfiguration (ConfigurationUserLevel.None); if (config != null) { AppSettingsSection appSettings = config.AppSettings as AppSettingsSection; string s0 = config.AppSettings.Settings["DbProvider"].Value; } |
Meine Vermutung ist: Wenn über ExeConfigurationFileMap alle Pfade zugewiesen werden, werden alle config-Ebenen einbezogen (machine, app, user). Wenn (auf welchem Weg auch immer) nur ein Pfad bereitgestellt wird, wird nur diese Ebene zur Verfügung gestellt.
Ich hoffe, das hilft dir weiter. Jürgen
c#surfer - Sa 30.01.10 13:02
Hallo Jürgen,
nochmal vielen Dank für deine Mühe!
Ich werde mir dien Vorschlag nochmal genauer ansehen, aber auf den esten Blick sieht es so aus, als würde
C#-Quelltext
1: 2: 3: 4: 5: 6: 7:
| Configuration config = ConfigurationManager.OpenExeConfiguration (ConfigurationUserLevel.None); if (config != null) { AppSettingsSection appSettings = config.AppSettings as AppSettingsSection; string s0 = config.AppSettings.Settings["DbProvider"].Value; } |
sich wieder nur auf die eigene config beziehen. Aber ich werde es mir noch genauer ansehen.
Viele Grüße
c#surfer
JüTho - Sa 30.01.10 15:18
c#surfer hat folgendes geschrieben : |
Ich werde mir dien Vorschlag nochmal genauer ansehen, aber auf den esten Blick sieht es so aus, als würde ConfigurationManager.OpenExeConfiguration sich wieder nur auf die eigene config beziehen. |
Du hast natürlich recht; also hatte ich damals etwas Anderes damit lösen wollen. Versuch es doch besser mit ExeConfigurationFileMap. Idee: Benutze für alle Pfadangaben denselben Pfad.
Gruß Jürgen
c#surfer - Di 02.02.10 18:51
JüTho hat folgendes geschrieben : |
Versuch es doch besser mit ExeConfigurationFileMap. Idee: Benutze für alle Pfadangaben denselben Pfad. |
Das geht leider auch nicht bzw ich wüsste nicht wie ich dann an die Settings rankomme. Wie in deinem Beispiel auch zu sehen ist, muss wohl für eine Configuration zuerst eine Section gewählt werden und dann kann man auf die entsprechende Settings zugrefen. Eine user.config hat aber keine Sections.
Lass uns die Versuche hier stoppen, das wird sonst zu aufwendig mit ungewissem Ausgang - Trotzdem vielen Dank für deine Unterstützung!!!
Grüße
c#surfer
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!