2012-07-02 7 views
11

Ich habe eine kleine GUI für die Verwaltung einiger Einstellungen in einer app.config-Datei gemacht. Die GUI wird als Teil meines Produkts veröffentlicht, wodurch es möglich ist, Werte in der Datei app.config zu ändern, ohne diese in einem Texteditor zu öffnen.Vermeiden versionsspezifische Informationen in configSection in app.config

Die Eigenschaften werden in einer benutzerdefinierten configSection implementiert, wodurch der Code stark typisiert wird. Mein Problem ist, dass, wenn die app.config-Datei aktualisiert wird (wenn ich von der GUI zu speichern), der vollständig qualifizierte Name meiner Montage in der configSection wie folgt geschrieben wird:

<section name="ConfigurationSettings" type="PerformanceDude.MSBuildShellExtension.Common.ConfigurationSettings, Common, Version=2.2.1.0, Culture=neutral, PublicKeyToken=1ab1b15115e63xxx" /> 

Wenn ich diese Versammlung ein Upgrade auf Eine neue Versionsnummer, die Version der GUI-Code-Assemblierung stimmt nicht mehr mit den Assembly-Referenzen in der app.config überein. Diese

ist, wie ich die Einstellungen laden:

var config = ConfigurationManager.OpenMappedExeConfiguration(new ExeConfigurationFileMap() { ExeConfigFilename = ConfigFilePath }, ConfigurationUserLevel.None); 
var settings = Config.GetSection("ConfigurationSettings") as ConfigurationSettings; 

Dies ist, wie ich die Einstellungen zu speichern:

config.Save(ConfigurationSaveMode.Minimal, true); 

Ich will nicht ein Upgrade-Skript ändert die Version jedes Mal wenn ich Update schreiben . Kennt jemand eine großartige Lösung für dieses Problem?

+2

Ist es möglich, den Code, den Sie zum Serialisieren und Speichern der Konfiguration verwenden, einzubinden? – dash

+0

Der Lade- und Speichercode ist jetzt in der Beschreibung :) – ThomasArdal

+0

Haben Sie jemals eine Lösung gefunden? – Zoomzoom

Antwort

2

Ich musste eine ähnliche Sache schon einmal machen. Am Ende habe ich die Konfigurationsdatei als XML geladen, die entsprechenden Abschnitte in Objekte deserialisiert und sie dann wieder in die XML-Datei eingefügt. Indem Sie die .net-Konfigurations-API auf diese Weise vermeiden, vermeiden Sie Probleme mit der Version.

Ein anderer Ansatz besteht darin, die alte Version der Assembly auf eine neue Version umzuleiten. Wenn sich Ihre Assembly im GAC befindet, können Sie hierfür Richtliniendateien verwenden und diese bereitstellen, wenn Sie eine neue Version bereitstellen. dann spielen die Versionsnummern in der Config keine Rolle.

+0

Eigentlich --- Wenn Sie die Konfigurations-DLL dem GAC hinzufügen, benötigen Sie keinen vollständig qualifizierten Namen, wenn Sie Ihren Konfigurationsabschnitt definieren. Alles, was Sie brauchen, ist (Klasse, Assembly) –

+0

Sure @SASS_Shooter, aber der Punkt ist, dass er sich nicht kümmern muss, wenn etwas die Versionsnummer dort eingibt, wenn er eine Richtliniendatei hat. – tallseth

+1

Die DLL ist nicht in der GAC. Wenn ich die Konfiguration als XML lade, würden die Daten nicht stark in C# eingegeben werden. Die ganze Idee mit der Verwendung eines Config-Abschnitts bestand darin, dass ich jede Eigenschaft über ein C# -Objekt mit stark typisierten Eigenschaften laden und speichern konnte. Vielen Dank für Ihren Vorschlag, obwohl :) – ThomasArdal