Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
In diesem Thema wird beschrieben, wie die Architektur der Anwendungseinstellungen funktioniert, und es werden erweiterte Features der Architektur erläutert, z. B. gruppierte Einstellungen und Einstellungsschlüssel.
Die Anwendungseinstellungsarchitektur unterstützt die Definition stark typierter Einstellungen mit Anwendungs- oder Benutzerbereich und das Beibehalten der Einstellungen zwischen Anwendungssitzungen. Die Architektur bietet ein Standardpersistenzmodul zum Speichern und Laden von Einstellungen aus dem lokalen Dateisystem. Die Architektur definiert auch Schnittstellen für die Bereitstellung eines benutzerdefinierten Persistenzmoduls.
Schnittstellen werden bereitgestellt, mit denen benutzerdefinierte Komponenten ihre eigenen Einstellungen beibehalten können, wenn sie in einer Anwendung gehostet werden. Mithilfe von Einstellungsschlüsseln können Komponenten Einstellungen für mehrere Instanzen der Komponente getrennt beibehalten.
Definieren von Einstellungen
Die Architektur der Anwendungseinstellungen wird sowohl in ASP.NET als auch in Windows Forms verwendet und enthält eine Reihe von Basisklassen, die in beiden Umgebungen gemeinsam verwendet werden. Das Wichtigste ist SettingsBase, das den Zugriff auf Einstellungen über eine Auflistung ermöglicht und Methoden auf niedriger Ebene zum Laden und Speichern von Einstellungen bereitstellt. Jede Umgebung implementiert eine eigene Klasse, die von SettingsBase abgeleitet wird, um zusätzliche Einstellungen für diese Umgebung bereitzustellen. In einer Windows Forms-basierten Anwendung müssen alle Anwendungseinstellungen für eine von der ApplicationSettingsBase Klasse abgeleitete Klasse definiert werden, die der Basisklasse die folgende Funktionalität hinzufügt:
Lade- und Speichervorgänge auf höherer Ebene
Unterstützung für benutzerspezifische Einstellungen
Zurücksetzen der Einstellungen eines Benutzers auf die vordefinierten Standardwerte
Aktualisieren von Einstellungen von einer früheren Anwendungsversion
Überprüfen von Einstellungen, entweder bevor sie geändert werden oder bevor sie gespeichert werden
Die Einstellungen können mithilfe einer Reihe von Attributen beschrieben werden, die System.Configuration im Namespace definiert sind. Diese werden in den Anwendungseinstellungenattributen beschrieben. Wenn Sie eine Einstellung definieren, müssen Sie diese entweder mit ApplicationScopedSettingAttribute oder UserScopedSettingAttribute anwenden, um festzulegen, ob die Einstellung für die gesamte Anwendung oder nur für den aktuellen Benutzer gilt.
Im folgenden Codebeispiel wird eine benutzerdefinierte Einstellungsklasse mit einer einzelnen Einstellung definiert. BackgroundColor
using System;
using System.Configuration;
using System.Drawing;
public class MyUserSettings : ApplicationSettingsBase
{
[UserScopedSetting()]
[DefaultSettingValue("white")]
public Color BackgroundColor
{
get
{
return ((Color)this["BackgroundColor"]);
}
set
{
this["BackgroundColor"] = (Color)value;
}
}
}
Imports System.Configuration
Public Class MyUserSettings
Inherits ApplicationSettingsBase
<UserScopedSetting()> _
<DefaultSettingValue("white")> _
Public Property BackgroundColor() As Color
Get
BackgroundColor = Me("BackgroundColor")
End Get
Set(ByVal value As Color)
Me("BackgroundColor") = value
End Set
End Property
End Class
Beständigkeit von Einstellungen
Die ApplicationSettingsBase Klasse selbst speichert oder lädt keine Einstellungen; diese Aufgabe fällt dem Einstellungsverwaltung zu, einer Klasse, die von SettingsProvider abgeleitet ist. Wenn eine abgeleitete Klasse von ApplicationSettingsBase keinen Einstellungsanbieter über den SettingsProviderAttribute angibt, wird der Standardanbieter LocalFileSettingsProvider verwendet.
Das konfigurationssystem, das ursprünglich mit .NET Framework veröffentlicht wurde, unterstützt die Bereitstellung statischer Anwendungskonfigurationsdaten entweder über die machine.config-Datei des lokalen Computers oder innerhalb einer app.
exe.config Datei, die Sie mit Ihrer Anwendung bereitstellen. Die LocalFileSettingsProvider Klasse erweitert diese native Unterstützung auf folgende Weise:
Anwendungsbezogene Einstellungen können in den machine.config- oder
app.
exe.config-Dateien gespeichert werden. Machine.config ist immer schreibgeschützt, währendapp
.exe.config durch Sicherheitsüberlegungen auf schreibgeschützt für die meisten Anwendungen beschränkt ist.Benutzerbereichseinstellungen können in
app
.exe.config Dateien gespeichert werden, in diesem Fall werden sie als statische Standardwerte behandelt.Nicht-Standard-Benutzereinstellungen werden in einer neuen Datei user.config gespeichert. Sie können eine Standardeinstellung für eine benutzerbereichsspezifische Einstellung mit DefaultSettingValueAttribute festlegen. Da sich einstellungen mit Benutzerbereich häufig während der Anwendungsausführung ändern, istuser.config immer lese-/schreibgeschützt. Weitere Informationen finden Sie unter "Wo sind einstellungen mit Benutzerbereich gespeichert".
Alle drei Konfigurationsdateien speichern Einstellungen im XML-Format. Das oberste XML-Element für anwendungsbezogene Einstellungen ist <appSettings>
, während <userSettings>
für benutzerbezogene Einstellungen verwendet wird. Eine app
.exe.config Datei, die sowohl Anwendungsbereichseinstellungen als auch Standardeinstellungen für Benutzerbereichseinstellungen enthält, würde wie folgt aussehen:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
<sectionGroup name="applicationSettings" type="System.Configuration.ApplicationSettingsGroup, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" >
<section name="WindowsApplication1.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
</sectionGroup>
<sectionGroup name="userSettings" type="System.Configuration.UserSettingsGroup, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" >
<section name="WindowsApplication1.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" allowExeDefinition="MachineToLocalUser" />
</sectionGroup>
</configSections>
<applicationSettings>
<WindowsApplication1.Properties.Settings>
<setting name="Cursor" serializeAs="String">
<value>Default</value>
</setting>
<setting name="DoubleBuffering" serializeAs="String">
<value>False</value>
</setting>
</WindowsApplication1.Properties.Settings>
</applicationSettings>
<userSettings>
<WindowsApplication1.Properties.Settings>
<setting name="FormTitle" serializeAs="String">
<value>Form1</value>
</setting>
<setting name="FormSize" serializeAs="String">
<value>595, 536</value>
</setting>
</WindowsApplication1.Properties.Settings>
</userSettings>
</configuration>
Eine Definition der Elemente im Abschnitt "Anwendungseinstellungen" einer Konfigurationsdatei finden Sie unter Anwendungseinstellungenschema.
Einstellungsbindungen
Anwendungseinstellungen verwenden die Windows Forms-Datenbindungsarchitektur, um bidirektionale Kommunikation von Einstellungsupdates zwischen dem Einstellungsobjekt und den Komponenten bereitzustellen. Wenn Sie Visual Studio zum Erstellen von Anwendungseinstellungen verwenden und sie Komponenteneigenschaften zuweisen, werden diese Bindungen automatisch generiert.
Sie können eine Anwendungseinstellung nur an eine Komponente binden, die die IBindableComponent Schnittstelle unterstützt. Außerdem muss die Komponente ein Änderungsereignis für eine bestimmte gebundene Eigenschaft implementieren oder Anwendungseinstellungen benachrichtigen, dass die Eigenschaft über die INotifyPropertyChanged Schnittstelle geändert wurde. Wenn die Komponente IBindableComponent nicht implementiert und Sie über Visual Studio eine Bindung vornehmen, werden die gebundenen Eigenschaften zunächst festgelegt, aber nicht aktualisiert. Wenn die Komponente IBindableComponent implementiert, aber keine Benachrichtigungen zu Eigenschaftsänderungen unterstützt, wird die Bindung nicht in der Einstellungsdatei aktualisiert, wenn die Eigenschaft geändert wird.
Einige Windows Forms-Komponenten, wie z. B. ToolStripItem, unterstützen keine Einstellungsbindungen.
Serialisierung von Einstellungen
Wenn LocalFileSettingsProvider Einstellungen auf dem Datenträger gespeichert werden müssen, werden die folgenden Aktionen ausgeführt:
Verwendet Reflexion, um alle Eigenschaften zu untersuchen, die für Ihre ApplicationSettingsBase abgeleitete Klasse definiert sind, und sucht nach denen, die entweder mit ApplicationScopedSettingAttribute oder UserScopedSettingAttribute angewendet werden.
Serialisiert die Eigenschaft auf den Datenträger. Es versucht zuerst, den ConvertToString oder ConvertFromString des mit dem Typ verbundenen TypeConverter aufzurufen. Wenn dies nicht erfolgreich ist, wird stattdessen die XML-Serialisierung verwendet.
Bestimmt, welche Einstellungen auf der Grundlage des Attributs der Einstellung in welche Dateien verschoben werden.
Wenn Sie Ihre eigene Einstellungsklasse implementieren, können Sie mithilfe der SettingsSerializeAsAttributeSettingsSerializeAs Enumeration eine Einstellung für binäre oder benutzerdefinierte Serialisierung markieren. Weitere Informationen zum Erstellen ihrer eigenen Einstellungsklasse im Code finden Sie unter How to: Create Application Settings.
Speicherorte der Einstellungsdatei
Der Speicherort der app
.exe.config- und Benutzer -.config Dateien unterscheidet sich je nach Installation der Anwendung. Bei einer Windows Forms-basierten Anwendung, die auf den lokalen Computer kopiert wurde, app
wird sich.exe.config im selben Verzeichnis wie das Basisverzeichnis der ausführbaren Hauptdatei der Anwendung befinden, und Benutzer.config wird sich an dem von der Application.LocalUserAppDataPath Eigenschaft angegebenen Speicherort befinden. Für eine Anwendung, die mithilfe von ClickOnce installiert wird, befinden sich beide Dateien im ClickOnce-Datenverzeichnis unter %InstallRoot%\Dokumente und Einstellungen\Benutzername\Lokale Einstellungen.
Der Speicherort dieser Dateien unterscheidet sich geringfügig, wenn ein Benutzer Roamingprofile aktiviert hat, wodurch ein Benutzer unterschiedliche Windows- und Anwendungseinstellungen definieren kann, wenn er andere Computer in einer Domäne verwendet. In diesem Fall werden sowohl ClickOnce-Anwendungen als auch Nicht-ClickOnce-Anwendungen ihre app
.exe.config und Benutzer.config Benutzerdateien unter %InstallRoot%\Dokumente und Einstellungen\Benutzername\Anwendungsdaten gespeichert.
Weitere Informationen zur Funktionsweise des Features "Anwendungseinstellungen" mit der neuen Bereitstellungstechnologie finden Sie unter ClickOnce und Anwendungseinstellungen. Weitere Informationen zum ClickOnce-Datenverzeichnis finden Sie unter Zugreifen auf lokale und Remotedaten in ClickOnce-Anwendungen.
Anwendungseinstellungen und Sicherheit
Anwendungseinstellungen sind so konzipiert, dass sie teilweise vertrauenswürdig funktionieren, eine eingeschränkte Umgebung, die die Standardeinstellung für Windows Forms-Anwendungen ist, die über das Internet oder ein Intranet gehostet werden. Für die Verwendung von Anwendungseinstellungen mit dem Standardeinstellungsanbieter sind keine speziellen Berechtigungen erforderlich, die über eine teilweise Vertrauensstellung hinausgehen.
Wenn Anwendungseinstellungen in einer ClickOnce-Anwendung verwendet werden, wird die user
.config Datei im ClickOnce-Datenverzeichnis gespeichert. Die Größe der.config Datei der Anwendung user
darf das durch ClickOnce festgelegte Datenverzeichniskontingent nicht überschreiten. Weitere Informationen finden Sie unter ClickOnce und Anwendungseinstellungen.
Benutzerdefinierte Einstellungsanbieter
In der Anwendungseinstellungsarchitektur gibt es eine lose Kopplung zwischen der Anwendungseinstellungswrapperklasse, abgeleitet von ApplicationSettingsBase, und dem zugehörigen Einstellungsanbieter oder -anbietern, abgeleitet von SettingsProvider. Diese Zuordnung wird nur durch die auf die Wrapperklasse oder ihre einzelnen Eigenschaften angewendete SettingsProviderAttribute definiert. Wenn kein Einstellungsanbieter explizit angegeben ist, LocalFileSettingsProviderwird der Standardanbieter verwendet. Daher unterstützt die Architektur das Erstellen und Verwenden von Einstellungsanbietern, die benutzerdefiniert sind.
Angenommen, Sie möchten entwickeln und verwenden SqlSettingsProvider
, ein Anbieter, der alle Einstellungsdaten in einer Microsoft SQL Server-Datenbank speichert. Die SettingsProvider-abgeleitete Klasse würde diese Informationen in ihrer Initialize
-Methode als Parameter vom Typ System.Collections.Specialized.NameValueCollection empfangen. Anschließend implementieren Sie die GetPropertyValues Methode, um Ihre Einstellungen aus dem Datenspeicher abzurufen und SetPropertyValues zu speichern. Ihr Anbieter kann die SettingsPropertyCollection bereitgestellte Eigenschaft verwenden, um GetPropertyValues den Namen, den Typ und den Bereich der Eigenschaft sowie alle anderen für diese Eigenschaft definierten Einstellungsattribute zu bestimmen.
Ihr Anbieter muss eine Eigenschaft und eine Methode implementieren, deren Implementierungen möglicherweise nicht offensichtlich sind. Die ApplicationName Eigenschaft ist eine abstrakte Eigenschaft von SettingsProvider; Sie sollten sie programmieren, um Folgendes zurückzugeben:
public override string ApplicationName
{
get
{
return (System.Reflection.Assembly.GetExecutingAssembly().GetName().Name);
}
set
{
// Do nothing.
}
}
Public Overrides Property ApplicationName() As String
Get
ApplicationName = System.Reflection.Assembly.GetExecutingAssembly().GetName().Name
End Get
Set(ByVal value As String)
' Do nothing.
End Set
End Property
Die abgeleitete Klasse muss auch eine Initialize
Methode implementieren, die keine Argumente akzeptiert und keinen Wert zurückgibt. Diese Methode ist nicht durch SettingsProvider definiert.
Schließlich implementieren Sie IApplicationSettingsProvider in Ihrem Provider, um Unterstützung für das Aktualisieren von Einstellungen, das Zurücksetzen auf Standardeinstellungen und das Upgrade von einer Anwendungsversion zur anderen bereitzustellen.
Nachdem Sie Ihren Anbieter implementiert und kompiliert haben, müssen Sie Die Einstellungsklasse anweisen, diesen Anbieter anstelle des Standardwerts zu verwenden. Sie tun dies durch den SettingsProviderAttribute. Wenn sie auf eine gesamte Einstellungsklasse angewendet wird, wird der Anbieter für jede Einstellung verwendet, die die Klasse definiert; wenn sie auf einzelne Einstellungen angewendet wird, verwendet die Architektur der Anwendungseinstellungen diesen Anbieter nur für diese Einstellungen und verwendet LocalFileSettingsProvider sie für den Rest. Das folgende Codebeispiel zeigt, wie Sie die Einstellungsklasse anweisen, Ihren benutzerdefinierten Anbieter zu verwenden.
using System;
using System.Collections.Generic;
using System.Text;
using System.Configuration;
namespace ApplicationSettingsArchitectureCS
{
[SettingsProvider("SqlSettingsProvider")]
class CustomSettings : ApplicationSettingsBase
{
// Implementation goes here.
}
}
Imports System.Configuration
<SettingsProvider("SqlSettingsProvider")> _
Public Class CustomSettings
Inherits ApplicationSettingsBase
' Implementation goes here.
End Class
Ein Anbieter kann von mehreren Threads gleichzeitig aufgerufen werden, aber er schreibt immer an denselben Speicherort. Daher instanziieren die Anwendungseinstellungen-Architektur nur eine einzelne Instanz Ihrer Anbieterklasse.
Von Bedeutung
Sie sollten sicherstellen, dass Ihr Anbieter threadsicher ist und nur jeweils einen Thread in die Konfigurationsdateien schreiben kann.
Ihr Anbieter muss nicht alle im System.Configuration-Namespace definierten Einstellungsattribute unterstützen, muss jedoch mindestens ApplicationScopedSettingAttribute und UserScopedSettingAttribute unterstützen und sollte auch DefaultSettingValueAttribute unterstützen. Für attribute, die nicht unterstützt werden, sollte Ihr Anbieter einfach ohne Benachrichtigung fehlschlagen; es sollte keine Ausnahme auslösen. Wenn die Einstellungsklasse jedoch eine ungültige Kombination von Attributen verwendet , z. B. anwenden ApplicationScopedSettingAttribute und UserScopedSettingAttribute auf dieselbe Einstellung, sollte Ihr Anbieter eine Ausnahme auslösen und den Vorgang beenden.
Siehe auch
.NET Desktop feedback