Beiträge getagged mit user.config
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.