Autor |
Beitrag |
c#surfer
      
Beiträge: 42
Erhaltene Danke: 2
|
Verfasst: Fr 29.01.10 16:17
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
      
Beiträge: 2021
Erhaltene Danke: 6
Win XP Prof
C# 2.0 (#D für NET 2.0, dazu Firebird); früher Delphi 5 und Delphi 2005 Pro
|
Verfasst: 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 
      
Beiträge: 42
Erhaltene Danke: 2
|
Verfasst: 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
      
Beiträge: 2021
Erhaltene Danke: 6
Win XP Prof
C# 2.0 (#D für NET 2.0, dazu Firebird); früher Delphi 5 und Delphi 2005 Pro
|
Verfasst: 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 
      
Beiträge: 42
Erhaltene Danke: 2
|
Verfasst: 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
      
Beiträge: 2021
Erhaltene Danke: 6
Win XP Prof
C# 2.0 (#D für NET 2.0, dazu Firebird); früher Delphi 5 und Delphi 2005 Pro
|
Verfasst: 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 
      
Beiträge: 42
Erhaltene Danke: 2
|
Verfasst: 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
      
Beiträge: 2021
Erhaltene Danke: 6
Win XP Prof
C# 2.0 (#D für NET 2.0, dazu Firebird); früher Delphi 5 und Delphi 2005 Pro
|
Verfasst: 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 
      
Beiträge: 42
Erhaltene Danke: 2
|
Verfasst: 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
|
|