My.Settings bei neuer Softwareversion übernehmen

  • VB.NET

Es gibt 14 Antworten in diesem Thema. Der letzte Beitrag () ist von Dideldum.

    My.Settings bei neuer Softwareversion übernehmen

    Hallo, ich speichere einige Einstellungen eines Programms in den My. Settings.
    Wenn ich nun aber in den Projekteigenschaften Die Assembly- / Dateiversion ändere, sind beim nächsten Programmstart natürlich keine Settings mehr vorhanden. Gibt es eine Möglichkeit die "alten" Settings zu übernehmen?
    @Humax Das beste ist, Du speicherst die Settings an dem Ort ab, den Du selbst vorgeben kannst:
    UserSettingsProvider (Persistieren von UserSettings)
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Hallo, ich bekomme zwar gerade mit einem anderen Problem Hilfe hier im Forum und mag eigentlich nicht mehrere Sachen gleichzeitig machen, aber wenn der Thread noch nicht so alt ist, hat vielleicht auch der TE etwas davon, dass ich seinen Thread kapere :o)

    Ich habe nämlich das gleiche Problem wie der TE. Nach einem Update meines Programmes - mittels nUpdate - sind die Settings weg.
    Beim update wird in der Regel nur die Programm.exe durch eine neuere ersetzt.
    Gespeichert werden in den Settings DGV Spaltenbreiten als string ("15|50|75"), ca. 8 Settings gibt es.

    Nun habe ich den Code von @Cheffboss im Form_Load Event verwendet.
    Jedoch bekomme ich die Fehlermeldung: If Not My.Settings.Upgraded Then "Upgraded konnte nicht gefunden werden".
    Daher habe ich die Prüfung entfernt und verwende nur die eine Zeile: My.Settings.Upgrade()
    Das scheint zu funktionieren. Mit dieser Codezeile bleiben meine Spalten in den DGVs nach einem Update (nach einem ersetzen der Programm.exe) wie sie waren.

    Kann mir jemand erklären, was ich hier mache - was bewirkt diese Zeile?
    Bzw, wieso ist diese nötig (warum werden die Settings sonst überschrieben)?
    Wofür ist die Prüfung in @Cheffboss Code?
    Wäre in meinem Fall evtl. eine alternative Speicherung, wie z.B. von @RodFromGermany oben gezeigt ratsamer?
    Ich speichere die Version in My.Settings und vergleiche diese miteinander. Wird ein Unterschied festgestellt, wird ein Upgrade durchgeführt.
    So in etwa:

    VB.NET-Quellcode

    1. If My.Application.Info.Version.ToString <> My.Settings.Version Then
    2. My.Settings.Upgrade()
    3. My.Settings.Version = My.Application.Info.Version.ToString
    4. End If
    Wie bereits oben erwähnt.
    Muss man die Upgraded Settings als BOOLEAN erstellen.
    Dann kann man auf diese Zugreifen!
    Solange das nicht gemacht ist,
    kann das Programm nicht darauf zugreifen,weil es noch nicht existiert.
    Visual Basic.NET 8o
    MS-SQL
    8o
    Ja, sorry. Brett vorm Kopf - ist ja eigentlich ersichtlich...

    Magst du (ihr) mir noch verraten, wozu diese Prüfung dient?
    Also klar ich feuere My.Settings.Upgrade() nur dann wenn es auch Not tut.
    Aber warum nicht einfach bei jedem Programmstart?
    Und was genau macht My.Settings.Upgrade(), bzw. warum sind die Settings weg, wenn ich die exe ohne Upgrade() ersetze?
    @DerSmurf
    Die Prüfung ist da um nicht immer die Upgrade auszuführen.
    Sondern nur dann, wenn eine neue Version von deinen Programm gestartet wird.
    Das spart meiner Meinung nach Rechenleistung.
    Die Upgrade Methode fast alle Settings zusammen in eine Datei.
    Ohne dieses wäre der AppData Ordner voller „user.config“ Dateien, die keinen nutzen mehr haben.
    Und das System unnötigen Speicherplatz verliert(Sind aber meistens wenige MB).
    Das wäre meine Erklärung, bin gespannt was Ihr(die anderen) noch dazu sagt!
    :thumbup:
    Visual Basic.NET 8o
    MS-SQL
    8o
    Die Settings ist nicht weg, sondern wird nicht mehr verwendet. Für jede Programmversion, sogar abhängig ob im Debug-Modus oder Standard-Kompiliert, verwendet MS ein anderes / neues Verzeichnis.
    Diese Angaben sind ohne Gewähr denn tatsächlich habe ich keine Dokumentation dazu gefunden, aber meine Erfahrungen gemacht.
    Schau unter %LOCALAPPDATA%\<Name_deiner_App> und den folgenden Unterverzeichnissen nach.
    Settings.Upgrade() sorgt dafür, dass die Einstellungen der Vor-Version nicht verloren sind. Hier ist auch sichergestellt, dass es sich um eine neue Version handelt, die also gar keine echten User-Settings aufweisen konnte.

    Ich weiß nicht, ob ein permanentes Settings.Upgrade() nicht eher kontraproduktiv ist, habe ich nie ausprobiert. Ich könnte mir vorstellen, dass Du so dem Benutzer immer die Alt-Daten unterschiebst und er damit seine individuellen Änderungen (Position der Formen, Farben, whatever) gar nicht mehr wirklich setzen kann. Muss man mal ausprobieren wie sich das wirklich auswirkt.
    Jetzt kommt Licht ins dunkle :o)
    Den %LOCALAPPDATA%\ Ordner habe ich gefunden. Hier ist schön für jede Version ein Ordner, welche eine user.config enthält.
    Wenn ich die Version 1.0 habe und die exe durch Version 1.1 ersetze, macht also Settings.Upgrade nichts anderes als die User.config aus Ordner "1.0" in den Ordner "1.1" zu kopieren.

    Ich danke euch für die Erklärungen!
    Falls es noch jemanden interessiert, hier mein erweitertes Script, welches nach einem Versions-Update die alten Versions-Ordner und deren Inhalte löscht:

    Wichtig:
    Ein Eintrag in My.Settings:
    Name: "Programm_BenötigtUpgrade" Type: "Bool", Value: = "true"
    ist erforderlich

    Ablauf:

    Wird eine neue Version erstellt oder die Anwendung das erste Mal gestartet, werden die Default My.Settings-Einträge verwendet und ein neues Verzeichnis mit Namen der aktuellen Versionsnummer im Anwendungs-Settings-Ordner erstellt .
    Beim Befehl "My.Settigs.save" werden in diesem Versions-Ordner die My.Settings-Einträge der Anwendung in einer "user.config"-Datei gespeichert.
    In diesen My.Settings ist der o.g. Eintrag "Programm_BenötigtUpgrade = true" vorhanden.

    In der If-Bedingung erkennt die Anwendung durch den Befehl "My.Settings.Upgrade", dass die v.g. user.config-Datei aus einem ggf. vorhandenen älteren Version-Ordner in den Versions-Ordner der neuen Version kopiert werden soll.

    Dann wird der Eintrag "Programm_BenötigtUpgrade" in der ggf. aus der älteren Version kopierten My.Settings auf "False" gesetzt, damit bei weiteren Programmstarts keine unnötige Config-Ugrade-Prüfung mehr erfolgen.

    Anschliessend werden die My.Settings mit "My.Settings.Save" gespeichert (also der Wert "False" in "Programm_BenötigtUpgrade" in die aktuellen My.Settings eingetragen).

    Zum Schluss wird die Sub "CleanUpOldMySettingsFolders" aufgerufen, welche evtl. existierende alte Versions-Ordner löscht.

    VB.NET-Quellcode

    1. ' Globale Variablen-Deklaration (ich verwende diese Variablen auch in anderen Subs und Child-Fenstern, daher Definition im globalen Bereich). Wer das nicht braucht, kann diese auch in der Sub "CleanUpOldMySettingsFolders" dekarieren.
    2. ' Config-Pfad und Dateiname der "user.config"-Datei der Anwendung auslesen und der String-Variablen "UserConfigFile" zuweisen
    3. Dim config As Configuration = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.PerUserRoamingAndLocal)
    4. ' Wenn "Lokale" "user.config"-Datei verwendet wird:
    5. Public UserConfigFile As String = config.FilePath
    6. ' Oder, wenn "Roaming" "user-config"-Datei verwendet wird:
    7. Public UserConfigFile As String = config.FilePath.Replace("Local", "Roaming")
    8. Private Sub Mainform_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    9. ' My.Settings Versionswechsel Settings-Ordner aktualisieren
    10. If My.Settings.Programm_BenötigtUpgrade = True Then
    11. My.Settings.Upgrade()
    12. My.Settings.Programm_BenötigtUpgrade = False
    13. My.Settings.Save()
    14. CleanUpOldMySettingsFolders()
    15. End If
    16. end sub
    17. ' Die folgende Sub CleanUpOldMySettingsFolders löscht alle nicht mehr verwendeten Versions-Ordner und deren Inhalte im Anwendungs-Setings-Ordner in:
    18. ' C:\Users\%Benutzername%\AppData\Roaming\%ggf. Unternehmen%\%Assemblyname+Identifiercode%
    19. ' bzw. dem
    20. ' C:\Users\%Benutzername%\AppData\Local\%ggf. Unternehmen%\%Assemblyname+Identifiercode%
    21. ' und belässt nur den Ordner der aktuellen Version mit darin enthaltenen "user.config"-Datei
    22. Private Sub CleanUpOldMySettingsFolders()
    23. ' Dens aktuellen Anwendungs-Settings-Ordner für die Anwendung bestimmen
    24. Dim appSettingsDir As String = IO.Path.GetDirectoryName(IO.Path.GetDirectoryName(UserConfigFile))
    25. ' Wenn Pfad existiert
    26. If Directory.Exists(appSettingsDir) Then
    27. ' Enthaltene Versions-Verzeichnisse im Anwendungs-Settings-Ordner bestimmen
    28. Dim DirsToDelete() As String = Directory.GetDirectories(appSettingsDir, "*")
    29. ' Enthaltene Versions-Verzeichnisse durchgehen
    30. For Each DirToDelete As String In DirsToDelete
    31. ' Name des Versions-Unterverzeichnis auslesen
    32. Dim subDir As String = IO.Path.GetFileName(DirToDelete)
    33. ' Wenn subDir nicht das Verzeichnis der aktuellen Version (also ein Verzeichnis einer älteren Version) ist
    34. If subDir <> System.Windows.Forms.Application.ProductVersion Then
    35. ' user.config löschen
    36. Try
    37. IO.File.Delete(IO.Path.Combine(DirToDelete, "user.config"))
    38. Catch ex As System.Exception
    39. End Try
    40. ' Versions-Ordner löschen
    41. Try
    42. IO.Directory.Delete(DirToDelete)
    43. Catch ex As System.Exception
    44. End Try
    45. End If
    46. Next
    47. End If
    48. End Sub

    Dieser Beitrag wurde bereits 8 mal editiert, zuletzt von „Dideldum“ ()