Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

Eigene .config Dateien laden und wie bisher per ...Default.Variable darauf zugreifen
Cornflake
myCSharp.de - Member



Dabei seit:
Beiträge: 141
Herkunft: Bayern

Themenstarter:

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

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
inflames2k
myCSharp.de - Experte

Avatar #AARsmmPEUMee0tQa2JoB.png


Dabei seit:
Beiträge: 2.296

beantworten | zitieren | melden

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 | Spielkartenbibliothek
private Nachricht | Beiträge des Benutzers
herbivore
myCSharp.de - Experte

Avatar #avatar-2627.gif


Dabei seit:
Beiträge: 49.486
Herkunft: Berlin

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
BhaaL
myCSharp.de - Member

Avatar #erP6yAFiewXrJTqrvg6R.jpg


Dabei seit:
Beiträge: 655

beantworten | zitieren | melden

...oder aber einfach eine zweite Datei erstellen, die Settings sind standardmäßig nämlich partial.
private Nachricht | Beiträge des Benutzers
gfoidl
myCSharp.de - Team

Avatar #avatar-2894.jpg


Dabei seit:
Beiträge: 6.860
Herkunft: Waidring

beantworten | zitieren | melden

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!"
private Nachricht | Beiträge des Benutzers
Cornflake
myCSharp.de - Member



Dabei seit:
Beiträge: 141
Herkunft: Bayern

Themenstarter:

funzt nicht

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
Abt
myCSharp.de - Team

Avatar #avatar-4119.png


Dabei seit:
Beiträge: 16.294

beantworten | zitieren | melden

Ich würde dann auf die .NET Variante verzichten und ein eigenes SettingsProjekt mit einer zu serialierenden XML verwenden.
private Nachricht | Beiträge des Benutzers
Cornflake
myCSharp.de - Member



Dabei seit:
Beiträge: 141
Herkunft: Bayern

Themenstarter:

anders gelöst

beantworten | zitieren | melden

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.
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von Cornflake am .
private Nachricht | Beiträge des Benutzers
FZelle
myCSharp.de - Experte



Dabei seit:
Beiträge: 9.998

beantworten | zitieren | melden

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?!?
private Nachricht | Beiträge des Benutzers
Cornflake
myCSharp.de - Member



Dabei seit:
Beiträge: 141
Herkunft: Bayern

Themenstarter:

beantworten | zitieren | melden

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.
private Nachricht | Beiträge des Benutzers
jogibear9988
myCSharp.de - Member



Dabei seit:
Beiträge: 638
Herkunft: Offenau

beantworten | zitieren | melden

Das geht doch alles viel einfacher: Creating a Custom Settings Provider

C# Portable Settings Provider

Oder auch hier im Forum: [Artikel] Custom Settings Provider
Dieser Beitrag wurde 2 mal editiert, zum letzten Mal von jogibear9988 am .
cSharp Projekte : https://github.com/jogibear9988
private Nachricht | Beiträge des Benutzers
RX8
myCSharp.de - Member



Dabei seit:
Beiträge: 12
Herkunft: Siegburg

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
Cornflake
myCSharp.de - Member



Dabei seit:
Beiträge: 141
Herkunft: Bayern

Themenstarter:

beantworten | zitieren | melden

Thx für die weiteren Hinweise :)
Mal schauen wie weit ich diese noch mit umsetzen kann.
private Nachricht | Beiträge des Benutzers