Was ich erreichen möchte, ist sehr einfach: Ich habe eine Windows Forms-Anwendung (.NET 3.5), die einen Pfad zum Lesen von Informationen verwendet. Dieser Pfad kann vom Benutzer mithilfe des von mir bereitgestellten Optionsformulars geändert werden.
Jetzt möchte ich den Pfadwert zur späteren Verwendung in einer Datei speichern. Dies wäre eine der vielen Einstellungen, die in dieser Datei gespeichert sind. Diese Datei würde sich direkt im Anwendungsordner befinden.
Ich verstehe, dass drei Optionen verfügbar sind:
- ConfigurationSettings-Datei (appname.exe.config)
- Registrierung
- Benutzerdefinierte XML-Datei
Ich habe gelesen, dass die .NET-Konfigurationsdatei nicht zum Speichern von Werten vorgesehen ist. Was die Registrierung betrifft, möchte ich mich so weit wie möglich davon entfernen.
Bedeutet dies, dass ich eine benutzerdefinierte XML-Datei verwenden sollte, um Konfigurationseinstellungen zu speichern?
Wenn ja, würde ich gerne ein Codebeispiel dafür sehen (C #).
Ich habe andere Diskussionen zu diesem Thema gesehen, aber es ist mir immer noch nicht klar.
Antworten:
Wenn Sie mit Visual Studio arbeiten, ist es ziemlich einfach, dauerhafte Einstellungen zu erhalten. Klicken Sie im Projektmappen-Explorer mit der rechten Maustaste auf das Projekt und wählen Sie Eigenschaften. Wählen Sie die Registerkarte Einstellungen und klicken Sie auf den Hyperlink, wenn keine Einstellungen vorhanden sind.
Verwenden Sie die Registerkarte Einstellungen, um Anwendungseinstellungen zu erstellen. Visual Studio erstellt die Dateien
Settings.settings
undSettings.Designer.settings
das enthält die Singleton - KlasseSettings
geerbt Application . Sie können über Ihren Code auf diese Klasse zugreifen, um Anwendungseinstellungen zu lesen / schreiben:Diese Technik ist sowohl für Konsolen, Windows Forms als auch für andere Projekttypen anwendbar.
Beachten Sie, dass Sie die Bereichseigenschaft Ihrer Einstellungen festlegen müssen . Wenn Sie Anwendungsbereich auswählen, ist Settings.Default. <Ihreigenschaft> schreibgeschützt.
Referenz: Gewusst wie: Schreiben von Benutzereinstellungen zur Laufzeit mit C # - Microsoft Docs
quelle
Settings.Default.SomeProperty = 'value'; Settings.Default.Save();
klappt wunderbar. Oder liegt das daran, dass ich Benutzereinstellungen habe?Settings.Default.Save()
nichts tut, falsch ist. Wie @aku in der Antwort feststellt, sind die Einstellungen für den App-Bereich schreibgeschützt: Speichern ist für sie unwirksam. Verwenden Sie diesen benutzerdefinierten PortableSettingsProvider , um die Einstellungen für den Benutzerbereich in der app.config zu speichern, in der sich die exe anstelle der im AppData-Ordner des Benutzers befindet. Nein, im Allgemeinen nicht gut, aber ich verwende es während der Entwicklung, um die gleichen Einstellungen von Kompilierung zu Kompilierung zu verwenden (ohne sie werden bei jeder Kompilierung neue eindeutige Benutzerordner erstellt).Wenn Sie vorhaben, in einer Datei im selben Verzeichnis wie Ihre ausführbare Datei zu speichern, finden Sie hier eine nette Lösung, die das JSON- Format verwendet:
quelle
DEFAULT_FILENAME
, rufen Sie einfach ansettings.Save(theFileToSaveTo)
; Alle Kappen zu sein,DEFAULT_FILENAME
soll eine Konstante sein . Wenn Sie eine Lese- / Schreibeigenschaft wünschen, erstellen Sie eine und lassen Sie sie vom Konstruktor festlegenDEFAULT_FILENAME
. Lassen Sie dann den Standardargumentwert seinnull
, testen Sie dies und verwenden Sie Ihre Eigenschaft als Standardwert. Es ist etwas tippender, bietet Ihnen aber eine Standardschnittstelle.System.Web.Extensions.dll
wenn Sie dies noch nicht getan haben.Die Registrierung ist ein No-Go. Sie sind sich nicht sicher, ob der Benutzer, der Ihre Anwendung verwendet, über ausreichende Rechte zum Schreiben in die Registrierung verfügt.
Sie können die
app.config
Datei zum Speichern von Einstellungen auf Anwendungsebene verwenden (die für jeden Benutzer, der Ihre Anwendung verwendet, gleich sind).Ich würde benutzerspezifische Einstellungen in einer XML-Datei speichern, die im isolierten Speicher oder im Verzeichnis SpecialFolder.ApplicationData gespeichert würde .
Darüber hinaus ist es ab .NET 2.0 möglich, Werte wieder in der
app.config
Datei zu speichern.quelle
Die
ApplicationSettings
Klasse unterstützt das Speichern von Einstellungen in der Datei app.config nicht . Das ist sehr beabsichtigt; Anwendungen, die mit einem ordnungsgemäß gesicherten Benutzerkonto ausgeführt werden (z. B. Vista UAC), haben keinen Schreibzugriff auf den Installationsordner des Programms.Sie können das System mit der
ConfigurationManager
Klasse bekämpfen . Die triviale Problemumgehung besteht jedoch darin, in den Einstellungsdesigner zu wechseln und den Bereich der Einstellung in Benutzer zu ändern. Wenn dies zu Schwierigkeiten führt (z. B. ist die Einstellung für jeden Benutzer relevant), sollten Sie Ihre Optionsfunktion in ein separates Programm einfügen, damit Sie nach der Eingabeaufforderung zur Erhöhung von Berechtigungen fragen können. Oder verzichten Sie auf eine Einstellung.quelle
Das Argument registry / configurationSettings / XML scheint immer noch sehr aktiv zu sein. Ich habe sie alle verwendet, während die Technologie Fortschritte gemacht hat, aber mein Favorit basiert auf dem System von Threed in Kombination mit isoliertem Speicher .
Das folgende Beispiel ermöglicht das Speichern von Objekten mit dem Namen properties in einer Datei im isolierten Speicher. Sowie:
Eigenschaften können wiederhergestellt werden mit:
Dies ist nur ein Beispiel, das keine Best Practices enthält.
quelle
Ich wollte eine Bibliothek teilen, die ich dafür gebaut habe. Es ist eine winzige Bibliothek, aber eine große Verbesserung (IMHO) gegenüber .settings-Dateien.
Die Bibliothek heißt Jot (GitHub) . Hier ist ein alter Artikel von The Code Project, den ich darüber geschrieben habe.
So würden Sie es verwenden, um die Größe und Position eines Fensters zu verfolgen:
Der Vorteil im Vergleich zu .settings-Dateien: Es gibt erheblich weniger Code und es ist viel weniger fehleranfällig, da Sie jede Eigenschaft nur einmal erwähnen müssen .
Bei Einstellungsdateien müssen Sie jede Eigenschaft fünfmal erwähnen : einmal, wenn Sie die Eigenschaft explizit erstellen, und weitere viermal im Code, der die Werte hin und her kopiert.
Speicher, Serialisierung usw. sind vollständig konfigurierbar. Wenn die Zielobjekte von einem IoC- Container erstellt werden, können Sie [[einbinden] [], sodass die Verfolgung automatisch auf alle aufgelösten Objekte angewendet wird. Alles, was Sie tun müssen, um eine Eigenschaft dauerhaft zu machen, ist ein [Trackingable] zu schlagen. Attribut darauf.
Es ist hochgradig konfigurierbar und Sie können Folgendes konfigurieren: - wenn Daten global oder für jedes verfolgte Objekt beibehalten und angewendet werden - wie sie serialisiert werden - wo sie gespeichert werden (z. B. Datei, Datenbank, Online, isolierter Speicher, Registrierung) - Regeln, die die Anwendung abbrechen können / persistente Daten für eine Eigenschaft
Vertrauen Sie mir, die Bibliothek ist erstklassig!
quelle
Eine einfache Möglichkeit besteht darin, ein Konfigurationsdatenobjekt zu verwenden, es als XML-Datei mit dem Namen der Anwendung im lokalen Ordner zu speichern und beim Start zurückzulesen.
Hier ist ein Beispiel zum Speichern der Position und Größe eines Formulars.
Das Konfigurationsdatenobjekt ist stark typisiert und einfach zu verwenden:
Eine Manager-Klasse zum Speichern und Laden:
Jetzt können Sie eine Instanz erstellen und in den Lade- und Schließereignissen Ihres Formulars verwenden:
Die erstellte XML-Datei ist auch lesbar:
quelle
c:\program files\my application
Ordner, so dass das Speichern von Einstellungen einen Fehler auslöst. Ich möchte stattdessen die XML-Datei in AppData speichern, habe mich aber nur gefragt, ob es einen offensichtlichen Weg gibt, um dieses Problem zu umgehen, da dieser Ansatz für Sie anscheinend funktioniert hat.Ich mag die vorgeschlagene Lösung der Verwendung von
web.config
oder nichtapp.config
. Versuchen Sie, Ihr eigenes XML zu lesen. Schauen Sie sich die XML-Einstellungsdateien an - Keine web.config mehr .quelle
Andere Optionen, anstatt eine benutzerdefinierte XML-Datei zu verwenden, können wir ein benutzerfreundlicheres Dateiformat verwenden: JSON- oder YAML-Datei.
Sie können Ihre Einstellungsdatei in mehreren speziellen Ordnern (für alle Benutzer und pro Benutzer) speichern, wie hier aufgeführt. Environment.SpecialFolder Enumeration und mehrere Dateien (standardmäßig schreibgeschützt, pro Rolle, pro Benutzer usw.)
Wenn Sie mehrere Einstellungen verwenden möchten, können Sie diese Einstellungen zusammenführen: Beispiel: Zusammenführen von Einstellungen für Standard + BasicUser + AdminUser. Sie können Ihre eigenen Regeln verwenden: Die letzte überschreibt den Wert usw.
quelle
"Bedeutet dies, dass ich eine benutzerdefinierte XML-Datei verwenden sollte, um Konfigurationseinstellungen zu speichern?" Nein, nicht unbedingt. Wir verwenden SharpConfig für solche Operationen.
Zum Beispiel, wenn eine Konfigurationsdatei so ist
Wir können solche Werte abrufen
Es ist kompatibel mit .NET 2.0 und höher. Wir können Konfigurationsdateien im laufenden Betrieb erstellen und später speichern.
Quelle: http://sharpconfig.net/
GitHub: https://github.com/cemdervis/SharpConfig
quelle
Soweit ich das beurteilen kann, unterstützt .NET dauerhafte Einstellungen mithilfe der integrierten Funktion für Anwendungseinstellungen:
quelle
Manchmal möchten Sie diese Einstellungen entfernen, die in der herkömmlichen Datei web.config oder app.config gespeichert sind. Sie möchten eine genauere Kontrolle über die Bereitstellung Ihrer Einstellungseinträge und das getrennte Daten-Design. Oder Sie müssen das Hinzufügen neuer Einträge zur Laufzeit aktivieren.
Ich kann mir zwei gute Möglichkeiten vorstellen:
Der Vorteil der stark typisierten Version sind die stark typisierten Einstellungsnamen und -werte. Es besteht kein Risiko, Namen oder Datentypen zu vermischen. Der Nachteil ist, dass mehr Einstellungen codiert werden müssen, die zur Laufzeit nicht hinzugefügt werden können.
Bei der objektorientierten Version besteht der Vorteil darin, dass zur Laufzeit neue Einstellungen hinzugefügt werden können. Sie haben jedoch keine stark typisierten Namen und Werte. Muss mit String-IDs vorsichtig sein. Der Datentyp muss früher gespeichert werden, wenn ein Wert abgerufen wird.
Den Code der beiden voll funktionsfähigen Implementierungen finden Sie HIER .
quelle
Ja, es ist möglich, die Konfiguration zu speichern - aber es hängt ziemlich stark davon ab, wie Sie sich dafür entscheiden. Lassen Sie mich die technischen Unterschiede beschreiben, damit Sie die Optionen verstehen, die Sie haben:
Zunächst müssen Sie unterscheiden, ob Sie applicationSettings oder AppSettings in Ihrer Datei
*.exe.config
(auch bekannt alsApp.config
in Visual Studio) verwenden möchten. Hier werden grundlegende Unterschiede beschrieben .Beide bieten verschiedene Möglichkeiten zum Speichern von Änderungen:
config.Save(ConfigurationSaveMode.Modified);
, wobei config als definiert istconfig = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
).Properties.Settings.Default.Save();
) schreiben , werden diese auf Benutzerbasis geschrieben und an einem bestimmten Ort (zC:\Documents and Settings\USERID\Local Settings\Application Data\FIRMNAME\WindowsFormsTestApplicati_Url_tdq2oylz33rzq00sxhvxucu5edw2oghw\1.0.0.0
. B. ) gespeichert . Wie Hans Passant in seiner Antwort erwähnte , liegt dies daran, dass ein Benutzer normalerweise eingeschränkte Rechte an Programmdateien hat und nicht darauf schreiben kann, ohne die UAC-Eingabeaufforderung aufzurufen. Ein Nachteil ist, dass Sie beim Hinzufügen von Konfigurationsschlüsseln in Zukunft diese mit jedem Benutzerprofil synchronisieren müssen.Hinweis: Wie in der Frage erwähnt, gibt es eine dritte Option: Wenn Sie die Konfigurationsdatei als XML-Dokument behandeln, können Sie sie mithilfe der
System.Xml.Linq.XDocument
Klasse laden, ändern und speichern . Es ist nicht erforderlich, eine benutzerdefinierte XML-Datei zu verwenden. Sie können die vorhandene Konfigurationsdatei lesen. Zum Abfragen von Elementen können Sie sogar Linq-Abfragen verwenden. Ich habe ein Beispiel gegeben hier , um die Funktion überprüfenGetApplicationSetting
es in der Antwort.Wenn Sie benötigen Verschlüsselung , um Ihre Werte zu schützen, überprüfen Sie diese Antwort.
quelle
quelle