Laden...

Eigene .config Dateien laden und wie bisher per ...Default.Variable darauf zugreifen

Erstellt von Cornflake vor 10 Jahren Letzter Beitrag vor 10 Jahren 4.878 Views
C
Cornflake Themenstarter:in
142 Beiträge seit 2007
vor 10 Jahren
Eigene .config Dateien laden und wie bisher per ...Default.Variable darauf zugreifen

Hallo
Wenn man ein Programm lädt, kann man ja Einstellungen für Benutzer oder Anwendung in einer seperaten *.config Datei hinterlegen.
Wenn mein Programm Tool heißt und ich Variable "Startwert" als String für Anwendung hinterlegen will, werden die Einstellungen dafür in der Datei
Tool.exe.config im App-Ordner gespeichert.

Diese Tool.exe.config wird beim Programmstart geladen und ich kann in meiner Anwendung über
Tool.Properties.Settings.Default.Startwert auf den unter Startwert gespeicherten Wert zugreifen.

Jetzt das Problem.
Ich habe in meinem Programmordner 5 VerX.config Dateien für mein Programm vorbereitet. Aber ich kann beim Laden der .config keinen eigenen Dateinamen angeben. Im Programm wurde bisher auf die Tool.Properties.Settings.Default.Startwert zugegriffen. Jetzt möchte ich genauso zugreifen nur, dass dahinter im Programm wähltbar eine andere .config Datei steht.

Ok ich könnte natürlich bei Bedarf mir die benötigte .config in Tool.exe.config umbenennen, aber das muss doch auch besser gehen. Vor allem wenn ich in der Anwendung den Benutzer eine vorher erstellte Konfiguration auswählen lassen will.

Im Internet habe ich rausgefunden, das man sowas per:


ExeConfigurationFileMap fileMap = new ExeConfigurationFileMap();
fileMap.ExeConfigFilename = @"my.config";

Configuration myConfig = ConfigurationManager.OpenMappedExeConfiguration(fileMap, ConfigurationUserLevel.None);
KeyValueConfigurationCollection settings = myConfig.AppSettings.Settings;

lösen kann. Nur leider kann ich diese settings Variable nicht an meine Tool.Properties.Settings binden, um wieder wie vorher darauf zuzugreifen.

Hat jemand dazu eine Lösung, damit ich weiterhin per Tool.Properties.Settings.Default.Startwert auf die Einstellungswerte zugreifen kann?

Grüße Cornflake

2.298 Beiträge seit 2010
vor 10 Jahren

Mir fällt da nur eine Idee zu ein. Die bestehende Settingsdatei Löschen und eine Klasse erstellen, die Settings heißt und über eine Property Default die KeyValueConfigurationCollection bereitstellt.

Der Settings-Klasse verpasst du dann noch den Namespace Tool.Properties und kannst wie gehabt drauf zugreifen.

Wissen ist nicht alles. Man muss es auch anwenden können.

PS Fritz!Box API - TR-064 Schnittstelle | PS EventLogManager |

49.485 Beiträge seit 2005
vor 10 Jahren

Hallo zusammen,

die bestehende Settings-Klasse wurde von VS generiert. Löschen braucht man die nicht. Man kann sie einfach in eine eigene CS Datei verschieben und dort wie gewünscht anpassen.

herbivore

656 Beiträge seit 2008
vor 10 Jahren

...oder aber einfach eine zweite Datei erstellen, die Settings sind standardmäßig nämlich partial.

6.911 Beiträge seit 2009
vor 10 Jahren

Hallo Cornflake,

ich würde nur 1 config-Datei verwenden, darin kannst du aber verschiedene configSections haben und diese auch gezielt ansprechen. D.h. der Benutzer wählt nicht die config-Datei, sondern die configSection aus.

Alternativ könntest du eine neue AppDomain erstellen und dort beim AppDomainSetup den Dateinamen der config angeben. Ich denke aber dass das die aufwändigere Möglichkeit ist, aber damit kannst du dein gewünschtes Vorhaben erreichen.

mfG Gü

Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.

"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"

C
Cornflake Themenstarter:in
142 Beiträge seit 2007
vor 10 Jahren
funzt nicht

Hi
Ich habe das jetzt mal ausprobiert und eine Settings.cs Klasse erstellt mit folgendem Inhalt:



namespace Tool.Properties
{
    class settings
    {
        static System.Configuration.KeyValueConfigurationCollection mySettings;

        public static System.Configuration.KeyValueConfigurationCollection Default
        {
            get
            { return mySettings; }
            set
            { mySettings = value; }
        }

        internal static void LadeEinstellungen(string KonfigDatei)
        {
           
            System.Configuration.Configuration config;
            System.Configuration.ExeConfigurationFileMap configFile = new System.Configuration.ExeConfigurationFileMap();
            configFile.ExeConfigFilename = KonfigDatei;
            config = System.Configuration.ConfigurationManager.OpenMappedExeConfiguration(configFile, System.Configuration.ConfigurationUserLevel.None);
            config.Save(System.Configuration.ConfigurationSaveMode.Modified);
            System.Configuration.ConfigurationManager.RefreshSection("applicationSettings");

            mySettings = config.AppSettings.Settings;
            //Tool.Default = config.AppSettings  ;
        }
    }
}

Leider wird im intellisense in einer anderen Klasse dann leider immer noch nicht meine festgelegten Variablen angezeigt.



private void ButtonKonfigLaden_Click(object sender, EventArgs e)
        {
            string datei = lsbProfile.SelectedItem.ToString();
            LadeEinstellungen(datei );
            string StarterWert = Tool.Properties.settings.Default. //.... hier gibts keinen Startwert
        }

Ich vermute mal, da ja KeyValueConfigurationCollection nicht auf meine Profil.settings Datei typisiert ist, klappt das nicht so einfach.

Ich will das ganze schon sehr gerne in seperaten Dateien lösen, da wenn sich mit der Zeit immer mehr Konfigurationen ansammeln ich nicht zum Schluss eine nicht mehr wartbare Riesendatei haben möchte.

Grüße Cornflake

16.806 Beiträge seit 2008
vor 10 Jahren

Ich würde dann auf die .NET Variante verzichten und ein eigenes SettingsProjekt mit einer zu serialierenden XML verwenden.

C
Cornflake Themenstarter:in
142 Beiträge seit 2007
vor 10 Jahren
anders gelöst

Das war mir jetzt alles zu kompliziert.
Ich habe mir ne Methode geschrieben bei der wenn man aus einer liste von .config Dateien eine auswählt, diese in die Tool.exe.config umbenannte wird und dann mit ...reload() geladen wird. Ist zwar nicht die beste lösung aber es klappt.

F
10.010 Beiträge seit 2004
vor 10 Jahren

Evtl könnte es auch helfen mal die Schreibweise richtig zu machen.

Das Du keinen Kompiler Fehler bekommen hast hätte dich doch schon stutzig machen sollen.

  1. Settings großschreibung beachten.
  2. Partial?!?
C
Cornflake Themenstarter:in
142 Beiträge seit 2007
vor 10 Jahren

Hi
Das mit dem kopieren geht fürs erste. Aber nicht gerade perfekt.
Wenn ich das erste mal eine .config nach dem umkopieren mit reload geladen habe, kann ich danach keine andere Datei mehr umkopieren und reloaden.
Es wird kein Fehler erzeugt aber auch keine Änderung angezeigt.
Mit reset vorher gehts auch nicht. Irgendwie muss ich das settings Objekt zurücksetzen oder neu instanzieren.

Hat jemand dazu ne Erklärung oder Tipp?

EDIT: Ok mir ist gerade aufgefallen, dass dieses Problem nur in der Entwicklungsumgebung auftritt. Wenn ich das Tool direkt starte kommt es nicht zu diesem Verhalten.

J
641 Beiträge seit 2007
vor 10 Jahren

cSharp Projekte : https://github.com/jogibear9988

R
12 Beiträge seit 2013
vor 10 Jahren

Ich habe einen Lösung (ItemTemplate) für das Handling der Konfiguration erstellt, bei der man auch den Namen und den Speicherort der Konfigurationsdatei angeben kann.
Eventuell kannst du diese benutzen.

RuConfigManager

Gruß Klaus

Gruß RX8

C
Cornflake Themenstarter:in
142 Beiträge seit 2007
vor 10 Jahren

Thx für die weiteren Hinweise 😃
Mal schauen wie weit ich diese noch mit umsetzen kann.