Grundsätzlich besteht das Problem darin, dass jedes Mal, wenn sich die Assemblyversion ändert (dh der Benutzer installiert eine neue Version der Anwendung), alle Einstellungen auf die Standardeinstellungen zurückgesetzt werden (oder genauer gesagt, eine neue user.config-Datei wird in einem Ordner mit einer anderen Version erstellt Nummer als Name)
Wie kann ich beim Aktualisieren von Versionen dieselben Einstellungen beibehalten, da von der Verwendung von INI-Dateien oder der Registrierung abgeraten wird?
Als wir Clickonce verwendeten, schien es in der Lage zu sein, damit umzugehen, also sollte es möglich sein, aber ich bin mir nicht sicher, wie.
.net
settings
assemblyversions
Davy8
quelle
quelle
Antworten:
ApplicationSettingsBase verfügt über eine Methode namens Upgrade, mit der alle Einstellungen aus der vorherigen Version migriert werden.
Um die Zusammenführung auszuführen, wenn Sie eine neue Version Ihrer Anwendung veröffentlichen, können Sie in Ihrer Einstellungsdatei ein boolesches Flag definieren, das standardmäßig true ist. Nennen Sie es UpgradeRequired oder ähnliches.
Überprüfen Sie dann beim Start der Anwendung, ob das Flag gesetzt ist, und rufen Sie gegebenenfalls die Upgrade-Methode auf , setzen Sie das Flag auf false und speichern Sie Ihre Konfiguration.
Lesen Sie mehr über die Upgrade-Methode bei MSDN . Die GetPreviousVersion ist möglicherweise auch einen Blick wert, wenn Sie eine benutzerdefinierte Zusammenführung durchführen müssen.
quelle
appSettings
,userSettings
OderapplicationSettings
? Als Benutzereinstellung in Settings.Settings wird es beim ersten Ändern in false nie wieder wahr sein. Eine neue Version setzt ein UpgradeRequired nicht auf True zurück.Ich weiß, dass es eine Weile her ist ... Rufen
My.Settings.Upgrade()
Sie in einer Winforms-App einfach an, bevor Sie sie laden. Dadurch werden die neuesten Einstellungen abgerufen, unabhängig davon, ob es sich um die aktuelle oder eine frühere Version handelt.quelle
Hier ist meine Forschung für den Fall, dass es jemand anderem schwer fällt, Einstellungen zu migrieren, die geändert / entfernt wurden. Grundlegendes Problem ist, dass
GetPreviousVersion()
dies nicht funktioniert, wenn Sie die Einstellung in der neuen Version Ihrer Anwendung umbenannt oder entfernt haben. Sie müssen also die Einstellung in IhrerSettings
Klasse beibehalten , aber einige Attribute / Artefakte hinzufügen, damit Sie sie nicht versehentlich im Code an anderer Stelle verwenden und sie veralten lassen. Eine veraltete Beispieleinstellung würde in VB.NET folgendermaßen aussehen (kann leicht in C # übersetzt werden):Stellen Sie sicher, dass Sie diese Eigenschaft demselben Namespace / derselben Klasse hinzufügen, in dem sich Ihre Anwendungseinstellungen befinden. In VB.NET wird diese Klasse benannt
MySettings
und ist imMy
Namespace verfügbar . Sie können Teilklassenfunktionen verwenden, um zu verhindern, dass Ihre veralteten Einstellungen mit Ihren aktuellen Einstellungen verwechselt werden.Wir danken jsharrison für die Veröffentlichung eines hervorragenden Artikels zu diesem Thema. Weitere Details dazu finden Sie dort.
quelle
Hier ist eine Variation der hier vorgestellten Lösungen, die die Upgrade-Logik in eine abstrakte Klasse kapselt, von der Einstellungsklassen abgeleitet werden können.
Einige vorgeschlagene Lösungen verwenden ein DefaultSettingsValue-Attribut, um einen Wert anzugeben, der angibt, wann vorherige Einstellungen nicht geladen wurden. Ich bevorzuge es, einfach einen Typ zu verwenden, dessen Standardwert dies anzeigt. Als Bonus eine DateTime? ist hilfreich beim Debuggen von Informationen.
Ableiten von UserSettingsBase:
Und benutze es:
quelle
Wenn Ihre Änderungen an user.settings programmgesteuert vorgenommen werden, können Sie eine Kopie (nur) der Änderungen an user.settings in einer separaten Datei, z. B. user.customized.settings, verwalten.
Sie möchten die geänderten Einstellungen wahrscheinlich auch weiterhin in user.settings beibehalten und laden. Auf diese Weise können Sie den Benutzer bei der Installation einer neueren Version Ihrer Anwendung mit der neueren Version von user.settings fragen, ob er seine geänderten Einstellungen weiterhin verwenden möchte, indem er sie wieder in die neuen user.settings kopiert. Sie können sie im Großhandel importieren oder schicker werden und den Benutzer bitten, zu bestätigen, welche Einstellungen er weiterhin verwenden möchte.
BEARBEITEN: Ich habe den "genaueren" Teil über Baugruppenversionen zu schnell gelesen, wodurch eine neue user.settings in einem neuen versionierungsspezifischen Verzeichnis installiert wurde. Daher hilft Ihnen die obige Idee wahrscheinlich nicht weiter, kann aber einige Denkanstöße geben.
quelle
So habe ich damit umgegangen:
}}
und in der Einstellungsklasse habe ich die IsDefault-Eigenschaft definiert:
In den SaveSettings habe ich IsDefault auf false gesetzt:
quelle