gpt4 book ai didi

c# - ApplicationSettingsBase.Upgrade() 在使用 .NET 4.0 重新编译后不升级用户设置

转载 作者:可可西里 更新时间:2023-11-01 09:08:31 24 4
gpt4 key购买 nike

我有一个使用标准 ApplicationSettingsBase 来保存其用户设置的 C# 程序。这在 .NET 3.5 下运行良好。每当创建新版本的程序时,提供的 Upgrade() 方法都会正确地“重新加载”这些设置。

最近,我用.NET 4.0重新编译了程序。我的程序的版本号也增加了。但是,当我运行这个版本时,Upgrade() 似乎没有检测到任何以前的版本设置,也没有“重新加载”它们。它开始是空白的。

作为测试,我再次重新编译,回到 .NET 3.5。而这一次,Upgrade() 方法又开始工作了。

有没有办法让 Upgrade() 在切换框架时工作?还有什么我想念的吗?

最佳答案

我遇到了完全相同的问题,我再次从 .NET 3.5 重新编译到 .NET 4.0 测试了几次。

不幸的是,我的解决方案是在 vb.net 中,但我相信您可以使用许多转换程序之一在 c# 中看到它,例如 http://www.developerfusion.com/tools/convert/vb-to-csharp/

它涉及枚举 %AppData%\CompanyName 中的所有文件夹,以在您要升级的版本的文件夹名称中找到最新的 user.config 文件.

我发现在 Visual Studio 2010 下将我的应用程序重新编译为 .NET 4.0 会创建一个名为 %AppData%\CompanyName\AppName.exe_Url_blahbahblah 的新文件夹,即使我绝对没有更改任何其他设置或代码!

我在 .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

关于c# - ApplicationSettingsBase.Upgrade() 在使用 .NET 4.0 重新编译后不升级用户设置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2722209/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com