8

Ich brauche einige Einstellung einer Anwendung, die unter allen Benutzern des Computers freigegeben wird, aber auch zur Laufzeit geändert werden konnte. Diese Naht einfach, aber nach der Application Settings MSDN article, ist es entweder das eine oder das andere.So erhalten Sie eine Anwendungseinstellungen für alle Benutzer freigegeben, die zur Laufzeit geändert werden konnte

Es gibt zwei Arten von Anwendungseinstellungen, basierend auf -umfang:

  • Anwendungs ​​scoped Einstellungen können für Informationen verwendet werden, wie zum Beispiel eine URL für einen Webdienst oder einer Datenbank-Verbindungszeichenfolge. Diese Werte sind mit der Anwendung verknüpft. Daher können Benutzer sie zur Laufzeit nicht ändern.

  • Benutzerspezifische Einstellungen können für Informationen verwendet werden, z. B. um die letzte Position eines Formulars oder eine Schriftartpräferenz beizubehalten. Benutzer können diese Werte zur Laufzeit ändern.

ich Code schreiben konnte die app.config XML-Datei zu bearbeiten, aber da es in dem Programmverzeichnis ist, ist es unter Windows geschützt 7. Das ist also nicht möglich, ohne das Programm erhebend oder mit NTFS spielen Rechte.

Also muss ich die Konfigurationsdatei in einen gemeinsamen Ordner wie System.Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData) geschrieben werden.

Aber das ist eine ziemlich häufige Anforderung!

Also frage ich mich, ob es eine einfache Möglichkeit, dies zu erreichen, ohne das Rad neu zu erfinden, oder wenn ich meinen eigenen Setting Manager schreiben muss.

Antwort

4

Ich hatte ein ähnliches Problem und schrieb meine eigenen Einstellungen Klasse. Es war sehr einfach. Ich habe eine Settings-Klasse mit den benötigten Eigenschaften und einen SettingsManager mit Save() - und Load() -Methoden erstellt, die das Objekt einfach per XmlSerializer in/aus einer Datei serialisierten/deserialisierten.

Ja, es ist Ihr eigener Code, aber es ist sehr einfacher Code, braucht weniger Zeit als zu versuchen herauszufinden, ob es eine Komponente gibt, die das bietet, was Sie brauchen und wie Sie es anpassen können.

+0

Können Sie Ihren Code teilen? –

+0

Sehen Sie hier ein Beispiel, wie Sie dies tun: https://msdn.microsoft.com/en-gb/library/ms973902.aspx#persistappsettnet_creatingcustomclass – Simon

1

Die Infrastruktur für Anwendungseinstellungen unterstützt dies nicht - nur nicht editierbare Anwendungsdaten und benutzerspezifische Daten werden unterstützt. Sie können jedoch problemlos Ihre eigenen XML-Dateien in den Ordnern CommonApplicationData lesen und schreiben, anstatt die Anwendungsdaten zu verwenden.

+0

Es macht Sinn, wenn ich "Daten" durch "Einstellung" ersetzen, aber könnten Sie den letzten Satz erweitern?Im Grunde bedeutet das, dass ich meinen eigenen * Einstellungsmanager * schreiben muss, um sicherzustellen, dass ich einen Ordner erstellt habe, der die Konfigurationsdatei in 'CommonApplicationData' enthält und XML darauf schreibt/liest. Es gibt keine Klasse, die ich leicht erben könnte oder eine Schnittstelle, die ich implementieren könnte, um das Zeug zu erledigen? – DavRob60

+0

@ DavRob60 Nein - es ist kein "Einstellungsmanager" eingebaut, der das erledigt, leider. Sie könnten einfach XDocument (http://msdn.microsoft.com/en-us/library/system.xml.linq.xdocument.aspx) und ähnliches verwenden, um das Lesen/Schreiben aus XML einfach zu machen. –

+0

Was ist mit der [SettingsProvider Class] (http://msdn.microsoft.com/en-us/library/system.configuration.settingsprovider%28v=vs.100%29.aspx)? Gibt es etwas, um das herum gebaut werden kann, ist es etwas völlig anderes oder ist es nicht die Mühe, sich damit herumzuärgern? – DavRob60

2

Nachdem die Antworten hier zu lesen und spielen mit den ConfigurationManager.Open Verfahren endete ich mit dem Follow-up:

string path = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData), "MyApp", "MyApp.config"); 
Configuration MyAppConfig = ConfigurationManager.OpenMappedExeConfiguration(new ExeConfigurationFileMap { ExeConfigFilename = path }, ConfigurationUserLevel.None); 

Der nette Teil ist die Datei nicht existiert, und wenn Sie Save() auf ihn nennen, Es erstellt den Ordner und die Datei für Sie. AppSettings["key"] funktionierte nicht aber so hatte ich

MyAppConfig.AppSettings.Settings["key"].Value 

zu verwenden, um einen vorhandenen Wert und

MyAppConfig.AppSettings.Settings.Add("key", value) 

einen neuen Wert zu lesen und schreiben hinzuzufügen.