Ich hatte genau das gleiche Problem, und wieder habe ich dies mehrmals von .NET 3.5 neu zu .NET 4.0 getestet.
Leider meine Lösung ist in vb.net, aber ich bin sicher, dass Sie eine der vielen Konvertierungsprogramme können dies in C# zu sehen, wie http://www.developerfusion.com/tools/convert/vb-to-csharp/
Es geht in % durch alle Ordner Aufzählen AppData% \ CompanyName finden Sie die letzte user.config Datei in einem Ordnernamen der Version, von der Sie aktualisieren möchten.
Ich fand, dass mein App zu .NET 4.0 unter Visual Studio 2010 neu zu kompilieren einen neuen Ordner des Namen überhaupt schaffen würde % AppData% \ Company \ AppName.exe_Url_blahbahblah obwohl ich geändert hatte absolut keinen andere Einstellungen oder Code!
Alle meine früheren Versionen vor .NET 4.0 behielten den gleichen Ordnernamen und wurden erfolgreich aktualisiert. Das Kopieren der alten user.config-Datei (und des Versionsordnernamens) aus dem alten Ordner in die neue unter .NET 4.0 erstellte Ordnerstruktur (mit dem alten Versionsordnernamen) behebt das Problem - es wird jetzt aktualisiert.
Dieses Beispiel vorausgesetzt, dass Sie eine Benutzereinstellung IUpgraded benannt haben, die Falsch standardmäßig (und später auf True) gesetzt, um zu prüfen, um zu sehen, ob die Einstellungen Anfangs defalt Werte sind oder nicht - Sie jede verwenden andere Variable, die Sie stattdessen erstellt haben. Das Beispiel zeigt ein Upgrade von Version 1.2.0.0 auf etwas später, das Sie ändern können, indem Sie den Wert lastVersion ändern.
Der Code ist an der Spitze der Form Load-Ereignis des neuesten (.NET 4.0) Anwendungsversion platziert werden:
Imports System
Imports System.IO
If Not My.Settings.IUpgraded Then 'Upgrade application settings from previous version
My.Settings.Upgrade()
'The following routine is only relevant upgrading version 1.2.0.0
If Not My.Settings.IUpgraded Then 'enumerate AppData folder to find previous versions
Dim lastVersion As String = "1.2.0.0" 'version to upgrade settings from
Dim config_initial As System.Configuration.Configuration = System.Configuration.ConfigurationManager.OpenExeConfiguration(System.Configuration.ConfigurationUserLevel.PerUserRoamingAndLocal)
Dim fpath As String = config_initial.FilePath
For x = 1 To 3 'recurse backwards to find root CompanyName folder
fpath = fpath.Substring(0, InStrRev(fpath, "\", Len(fpath) - 1))
Next
fpath = fpath.Substring(0, Len(fpath) - 1) 'remove trailing backslash
Dim latestConfig As FileInfo 'If not set then no previous info found
Dim di As DirectoryInfo = New DirectoryInfo(fpath)
If di.Exists Then
For Each diSubDir As DirectoryInfo In di.GetDirectories(lastVersion, SearchOption.AllDirectories)
If InStr(diSubDir.FullName, ".vshost") = 0 Then 'don't find VS runtime copies
Dim files() As FileInfo = diSubDir.GetFiles("user.config", SearchOption.TopDirectoryOnly)
For Each File As FileInfo In files
Try
If File.LastWriteTime > latestConfig.LastWriteTime Then
latestConfig = File
End If
Catch
latestConfig = File
End Try
Next
End If
Next
End If
Try
If latestConfig.Exists Then
Dim newPath As String = config_initial.FilePath
newPath = newPath.Substring(0, InStrRev(newPath, "\", Len(newPath) - 1))
newPath = newPath.Substring(0, InStrRev(newPath, "\", Len(newPath) - 1))
newPath &= lastVersion
If Directory.Exists(newPath) = False Then
Directory.CreateDirectory(newPath)
End If
latestConfig.CopyTo(newPath & "\user.config")
My.Settings.Upgrade() 'Try upgrading again now old user.config exists in correct place
End If
Catch : End Try
End If
My.Settings.IUpgraded = True 'Always set this to avoid potential upgrade loop
My.Settings.Save()
End If
+1 ich diese Lösung implementiert haben, weil wir von .NET 2.0 auf .NET 4.0 aktualisiert haben. Ein kleiner Fehler - 'di.Exists' erkennt den Ordner nicht richtig, wenn er mit einem' .' endet, also muss er zuerst mit etwas wie [dieser Lösung] normalisiert werden (http://stackoverflow.com/questions/ 2281531/how-can-i-Vergleich-Verzeichnis-Pfade-in-c). – mellamokb
Danke, dass du mir hilfst, dass dies nicht der Fehler meines Codes ist.Sie haben mir wahrscheinlich Stunden der Überprüfung und Überprüfung (über die Stunden, die ich bereits verbracht habe) erspart. – Grault