Ich versuche, den Speicherort der user.config
Datei anzupassen . Derzeit ist es mit einem Hash und einer Versionsnummer gespeichert
%AppData%\[CompanyName]\[ExeName]_Url_[some_hash]\[Version]\
Ich möchte, dass es für die Version der Anwendung agnostisch ist
%AppData%\[CompanyName]\[ProductName]\
Kann das gemacht werden und wie? Was sind die Auswirkungen? Verliert der Benutzer nach dem Upgrade seine Einstellungen aus der vorherigen Version?
%AppData%\[CompanyName]/[ProductName]
wo wir darauf vertrauen können, dass sie erhalten bleiben.Antworten:
Um die erste Frage zu beantworten, können Sie die Datei technisch an einer beliebigen Stelle ablegen. Sie müssen sie jedoch selbst codieren, da der Standardspeicherort der Datei das erste Ihrer beiden Beispiele ist. ( Link, wie man es selbst macht )
Die zweite Frage hängt davon ab, wie Sie die Anwendung bereitstellen. Wenn Sie über eine MSI-Datei bereitstellen, gibt es zwei Hashes in den Eigenschaften des Setup-Projekts (aus dem die MSI erstellt wurde), den 'Upgrade-Code' und den 'Produktcode'. Diese bestimmen, wie die MSI installiert werden kann und ob sie neben einer anderen Version derselben Anwendung aktualisiert, überschrieben oder installiert wird.
Wenn Sie beispielsweise zwei Versionen Ihrer Software haben und diese unterschiedliche Upgrade-Codes haben, handelt es sich bei Windows um völlig unterschiedliche Softwareteile, unabhängig vom Namen. Wenn der 'Upgrade'-Code derselbe ist, der' Produkt'-Code jedoch anders ist, werden Sie beim Versuch, die 2. msi zu installieren, gefragt, ob Sie ein Upgrade durchführen möchten. Zu diesem Zeitpunkt sollen die Werte aus dem Code kopiert werden alte Konfiguration zu einer neuen Konfiguration. Wenn beide Werte gleich sind und sich die Versionsnummer nicht geändert hat, befindet sich die neue Konfiguration am selben Speicherort wie die alte Konfiguration und muss nichts tun. MSDN-Dokumentation
ClickOnce ist ein bisschen anders, da es mehr auf der ClickOnce-Versionsnummer und dem URL-Pfad basiert. Ich habe jedoch festgestellt, dass die neue Version der Anwendung weiterhin die Datei verwendet, solange Sie weiterhin am selben Speicherort veröffentlichen vorhandene Konfiguration. ( Link zum Umgang von ClickOnce mit Updates )
Ich weiß auch, dass es eine Möglichkeit gibt, Konfigurationen während der Installation der MSI mithilfe von benutzerdefinierten Installationsskripten manuell zusammenzuführen, aber ich erinnere mich nicht an die genauen Schritte, um dies zu tun ... (siehe diesen Link für die Vorgehensweise mit einem Web. config)
quelle
Ich wollte diesen zitierten Text als Referenz hinzufügen, wenn ich dieses Problem in Zukunft habe. Angeblich können Sie die ApplicationSettings-Infrastruktur anweisen, Einstellungen aus einer früheren Version zu kopieren, indem Sie Upgrade aufrufen :
Aus dem FAQ- Blogbeitrag zu den Kundeneinstellungen: ( Archiv )
Ich glaube keine Sekunde lang, dass es tatsächlich funktionieren könnte - Microsoft würde diese Fähigkeit auf keinen Fall bereitstellen, aber die Methode ist genauso.
quelle
if(CallUpgrade) { Upgrade(); }
Aussage verwendet.Properties.Settings.Value
Ich habe dasProperties.Settings
Teil, aber vermisse ich etwas oder ist das spezifisch für dich?Upgrade
funktioniert dies nicht.Properties.Settings.Default.Upgrade()
Properties.Settings.Default.Save();
nach dem Ändern in false hinzuzufügen :-)Die Datei user.config wird unter gespeichert
c:\Documents and Settings>\<username>\[Local Settings\]Application Data\<companyname>\<appdomainname>_<eid>_<hash>\<verison>
<c:\Documents and Settings>
ist das Benutzerdatenverzeichnis, entweder ohne Roaming (lokale Einstellungen oben) oder als Roaming.<username>
ist der Benutzername.<companyname>
ist der CompanyNameAttribute-Wert, falls verfügbar. Andernfalls ignorieren Sie dieses Element.<appdomainname>
ist der AppDomain.CurrentDomain.FriendlyName. Dies ist normalerweise der Standardname .exe.<eid>
ist die URL, der starke Name oder der Pfad, basierend auf den für den Hash verfügbaren Beweisen.<hash>
ist ein SHA1-Hash von Beweisen, die aus der CurrentDomain in der folgenden bevorzugten Reihenfolge gesammelt wurden:1. StrongName
2. URL:
Wenn keines davon verfügbar ist, verwenden Sie den EXE-Pfad.
<version>
ist die AssemblyVersionAttribute-Einstellung von AssemblyInfo.Die vollständige Beschreibung finden Sie hier http://msdn.microsoft.com/en-us/library/ms379611.aspx
quelle
(Ich würde dies als Kommentar zu @ Amrs Antwort hinzufügen, aber ich habe noch nicht genug Repräsentanten, um das zu tun.)
Die Informationen im MSDN-Artikel sind sehr klar und scheinen weiterhin zu gelten. Es wird jedoch nicht erwähnt, dass der SHA1-Hash eher als Basis 32 codiert als als die typischere Basis 16 ausgeschrieben ist.
Ich glaube, der verwendete Algorithmus ist in implementiert
ToBase32StringSuitableForDirName
, der hier in der Microsoft-Referenzquelle zu finden ist .quelle