C# Properties.Settings portabel machen


… oder: „Warum werden meine Änderungen in meiner AppName.exe.config nicht berücksichtigt?!“

Es hat eine Weile gedauert, bis ich die Funktionsweise kapiert hatte.

Folgendes musste ich erst herausfinden:

  • Bereich Benutzer sind zur Laufzeit änderbar, Anwendung nicht und werden erst durch einen Neustart der Anwendung aktiv
  • Das Ändern der Settings in der XML Datei AppName.exe.config klappt nicht, da Benutzer-Einstellungen für jeden Nutzer seperat abgespeichert werden unter einem kryptischem Pfad wie z.B:
    C:\Users\flowschi\AppData\Local\[Herstellername]\[Anwendungsname mit kryptischem String] – genauer Pfad abhängig von Faktoren wie Roaming true/false und Bereich der Settings (Anwendung/Benutzer)
  • Löscht man diese user.config, wird sie beim nächsten Programmstart erneut mit den Standardwerten aus der AppName.exe.config aus dem Programmverzeichnis erstellt
  • An den Pfad kommt man über die .NET Anwendung mit (Verweis zu System.Configuration nötig):

[sourcecode language=“csharp“]// Machine Configuration Path
string path1 = ConfigurationManager.OpenMachineConfiguration().FilePath;
// Application Configuration Path
string path2 = ConfigurationManager.OpenExeConfiguration(
ConfigurationUserLevel.None).FilePath;
// User Configuration Path
string path3 = ConfigurationManager.OpenExeConfiguration(
ConfigurationUserLevel.PerUserRoamingAndLocal).FilePath;[/sourcecode]

Das alles mag teilweise recht praktisch sein, aber ich suchte nach einer Möglichkeit das ganze sehr einfach zu halten und mit einer einzigen Konfigurationsdatei auszukommen. Die sollte auch schön bei der Anwendung liegen, so dass ein Benutzer ggf. per Hand leicht was an der Konfiguration ändern kann und vor allem die ganze Anwendung mitsamt Einstellungen portabel bleibt.

Fündig geworden bin ich bei Mike Nathan auf Geek Republic. Sein C# Portable Settings Provider macht genau das. Da ich meine Settings nicht unter Properties gespeichert habe sondern in einem eigenen Ordner, war noch etwas Anpassung nötig:

[sourcecode language=“csharp“]
// Application Specific Node
//string APPNODE = System.Reflection.Assembly.GetExecutingAssembly().GetName().Name + ".Properties.Settings";
string APPNODE = "SYMAP_Daten_Logger.Settings";
[/sourcecode]

Weiß jemand wie ich den Standard-Namespace meines Projektes herausbekomme ohne ihn statisch festzulegen?

Eines sollte einem aber noch bewusst sein: Baut man doch einen Installer und installiert die Software unter C:\Program Files\ …, so wird auch versucht dort die Konfigurations-Datei zu speichern. Das geht aber schief, weil hierfür die nötigen Rechte fehlen.

, ,

  1. #1 von Axel am 19. Juli 2015 - 12:37

    Hallo Florian, hast du für einen Anfänger ein Beispielprojekt? Ich verwende derzeit VS 2015. Vielen Dank.

  2. #2 von Axel am 19. Juli 2015 - 14:52

    Nach langem hin- und her probieren klappt es anscheinend, die User-Konfigurationsdatei wird endlich in das gleiche Verzeichnis abgelegt, gelesen und geschrieben, hier meine Änderungen:

    # Suchen / Search
    /// The application settings filename.
    public virtual string GetSettingsFilename() { return Path.Combine(GetSettingsPath(), ApplicationName + „.user.config“); }

    # Ersetzen mit / Replace with
    /// The application settings filename.
    /// Change the filename (Example: .user.config)
    public virtual string GetSettingsFilename() { return Path.Combine(ApplicationName + „.user.config“); }

    # Suchen / Search
    _SettingsPath = Path.Combine(Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), coname), ApplicationName);

    # Ersetzen mit / Replace with
    /// Saves the settings in the current folder.
    _SettingsPath = Path.Combine(ApplicationName);

    Damit alle Einstellungen in dieser Datei landen, muss für jede Einstellung folgendes unternommen werden:
    Project -> Properties -> Settings, entweder Eintrag einzeln oder alle markieren, im Fenster „Properties“ bei Provider den Wert: PortableSettingsProvider hinzufügen, danach sollten die Einstellungen im aktuellen Ordner der Anwendung gespeichert werden.

    Einen Vorteil hat dies: für Fensterpositionen etc. ist die Datei ausreichend, für spezielle Einstellungen die für jeweils verschiedene Benutzer gelten sollen, kann weiterhin der Standard-Speicherort verwendet werden.

    Nach belieben können bestimmt noch weitere Anpassungen vorgenommen werden.

    Alle Angaben ohne Gewähr. Code getestet in Visual Studio 2015.

    • #3 von Axel am 19. Juli 2015 - 14:59

      Nachtrag:

      Ich habe eben einen kosmetischen Fehler gefunden, wo ein leerer Ordner angelegt wird, welcher in dieser Hinsicht überflüssig ist, bitte folgendes machen:

      # Suchen / Search
      _SettingsPath = Path.Combine(Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), coname), ApplicationName);

      Beziehungsweise bei bereits vorgenommener Änderung

      # Suchen / Search
      _SettingsPath = Path.Combine(ApplicationName);

      # Ersetzen mit / Replace with
      /// Saves the settings in the current folder.
      _settingsPath = „./“;

      Ich hoffe das die Änderung konform ist.

      • #4 von Axel am 19. Juli 2015 - 15:40

        Nachtrag:
        Anscheinend macht Visual Studio Probleme, wenn der Provider eingetragen ist, dies macht sich bemerkbar, wenn das Formular in der Designer-Ansicht aufgerufen wird, angeblich ist der PortableSettingsProvider nicht auffindbar, warum auch immer (The type ‚PortableSettingsProvider‘ could not be found. Ensure that the assembly containing the type is referenced. If the assembly is part of the current development project, ensure that the project has been built. ). Die Designer-Ansicht ist nur verfügbar, wenn der Provider bei Settings nicht drin steht, die Anwendung selber funktioniert wenn der Provider eingetragen ist. Leider weiß ich nicht, wie sich das beheben lässt.

  3. #5 von Axel am 19. Juli 2015 - 16:07

    Letzter Nachtrag:
    Nach ein wenig suchen konnte augenscheinlich eine brauchbare Klasse gefunden werden (nateshoffner.com/blog/2013/01/c-reusable-portable-application-settings/) Zumindest meldet der Designer damit keine Fehlermeldung und die Einstellungsdatei landet sofort im gleichen Ordner wie die Anwendung.

    • #6 von flowschi am 21. Juli 2015 - 20:33

      Hallo,

      danke für deine Kommentare. Ich habe damit nun schon länger nicht mehr gearbeitet und kann so ad hoc da nicht viel zu sagen. Wenn ich es aber wieder brauche, weiß ich, wo ich weitere Infos finde – danke! 🙂

  4. #7 von Axel am 29. März 2016 - 22:21

    Hallo,
    des öfteren macht aber auch die andere Klasse Probleme. Bei einigen Projekten meckerte VS2015 nicht, und bei anderen erscheint mal wieder eine Fehlermeldung. Naja, irgendwo hakt es. Da ich mich als Anfänger bezeichne, und von der verlinkten Seite den letzten Abschnitt in Sachen DLL-Erstellung mich versucht hatte, klappte die Kompilierung anscheinend ohne Probleme, die DLL wurde erstellt, VS2015 erlaubt weiterhin Fehlermeldungen anzuzeigen, warum auch immer, die Einstellungen waren auch bei anderen Projektdateien gleich, nur da schien es ohne Probleme zu laufen. Hättest du eventuell eine Idee oder könnte der Code verbessert werden ohne das VS2015 Fehlermeldungen präsentiert?

    Könnte theoretisch die Anwendung so gebaut werden, dass der Anwender die Auswahl hätte, ob dieser sein Benutzerprofil oder die portable verwenden könnte?

    Vielen Dank 🙂

(wird nicht veröffentlicht)