我遇到了完全相同的问题,我再次测试了几次,从 .NET 3.5 重新编译到 .NET 4.0。
不幸的是,我的解决方案是在 vb.net 中,但我相信您可以使用众多转换程序之一在 c# 中看到这一点,例如 http://www.developerfusion.com/tools/convert/vb-to-csharp/
它涉及枚举 %AppData%\CompanyName 中的所有文件夹,以在您希望升级的版本的文件夹名称中找到最新的 user.config 文件.
我发现,即使我完全没有更改任何其他设置或代码!
我之前的所有 .NET 4.0 版本都保留了相同的文件夹名称并成功升级。将旧的 user.config 文件(和版本文件夹名称)从旧文件夹复制到在 .NET 4.0 下创建的新文件夹结构(使用旧版本文件夹名称)可以解决问题 - 现在将升级。
本示例假设您有一个名为 IUpgraded 的用户设置,默认情况下设置为 False(稍后设置为 True),以检查设置是否为初始设置默认值与否 - 您可以使用您创建的任何其他变量。该示例显示从版本 1.2.0.0 升级到更高版本,您可以通过更改 lastVersion 的值进行更改。
代码将放置在最新 (.NET 4.0) 应用程序版本的表单加载事件的顶部:
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