我有一个使用标准ApplicationSettingsBase保存用户设置的C#程序。这在.NET 3.5下工作得很好。无论何时创建我的程序的新版本,所提供的Upgrade()方法都会正确地“重新加载”这些设置。
最近,我用.NET 4.0重新编译了这个程序。我的程序的版本号也增加了。但是,当我运行这个版本时,Upgrade()似乎没有检测到任何以前的版本设置,也没有“重新加载”它们。它一开始就是空白的。
作为测试,我再次重新编译,回到.NET 3.5。这一次,Upgrade()方法又开始工作了。
有没有一种方法可以让Upgrade()在切换框架时工作?我还遗漏了什么吗?
发布于 2010-12-29 01:16:41
我有完全相同的问题,我再次测试了几次,从重新编译到.NET 4.0的.NET 3.5。
不幸的是,我的解决方案是vb.net,但我相信您可以使用众多转换程序中的一种来查看c#,比如http://www.developerfusion.com/tools/convert/vb-to-csharp/
它涉及枚举%AppData%\CompanyName中的所有文件夹,以便在您要从中升级的版本的文件夹名称中找到最新的user.config文件。
我发现在Visual Studio2010下重新编译我的应用程序到.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发布于 2012-10-19 20:51:24
下面是代码。
public static class SettingsUpdate
{
public static void Update()
{
try
{
var a = Assembly.GetExecutingAssembly();
string appVersionString = a.GetName().Version.ToString();
if( UserSettings.Default.internalApplicationVersion != appVersionString )
{
var currentConfig = ConfigurationManager.OpenExeConfiguration( ConfigurationUserLevel.PerUserRoamingAndLocal );
var exeName = "MyApplication.exe";
var companyFolder = new DirectoryInfo( currentConfig.FilePath ).Parent.Parent.Parent;
FileInfo latestConfig = null;
foreach( var diSubDir in companyFolder.GetDirectories( "*" + exeName + "*", SearchOption.AllDirectories ) )
{
foreach( var file in diSubDir.GetFiles( "user.config", SearchOption.AllDirectories ) )
{
if( latestConfig == null || file.LastWriteTime > latestConfig.LastWriteTime )
{
latestConfig = file;
}
}
}
if( latestConfig != null )
{
var lastestConfigDirectoryName = Path.GetFileName( Path.GetDirectoryName( latestConfig.FullName ) );
var latestVersion = new Version( lastestConfigDirectoryName );
var lastFramework35Version = new Version( "4.0.4605.25401" );
if( latestVersion <= lastFramework35Version )
{
var destinationFile = Path.GetDirectoryName( Path.GetDirectoryName( currentConfig.FilePath ) );
destinationFile = Path.Combine( destinationFile, lastestConfigDirectoryName );
if( !Directory.Exists( destinationFile ) )
{
Directory.CreateDirectory( destinationFile );
}
destinationFile = Path.Combine( destinationFile, latestConfig.Name );
File.Copy( latestConfig.FullName, destinationFile );
}
}
Properties.Settings.Default.Upgrade();
UserSettings.Default.Upgrade();
UserSettings.Default.internalApplicationVersion = appVersionString;
UserSettings.Default.Save();
}
}
catch( Exception ex )
{
LogManager.WriteExceptionReport( ex );
}
}
}希望这将对您有所帮助:)
发布于 2018-12-12 20:14:04
当Settings1.Upgrade()没有像您期望的那样工作时,可能会尝试删除以前的用户配置文件,然后重试。
在我的例子中,发布和调试版本是不相关的,那么升级似乎失败了,因为与调试/发布输出相关的同一目录中的版本之间存在冲突。
清除所有以前的用户配置文件(appdata\local....)似乎解决了这个问题,调用Upgrade()就行了,这里提出的变通方法也行得通。
我希望它能为你工作。
https://stackoverflow.com/questions/2722209
复制相似问题