首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用.NET 4.0重新编译后,ApplicationSettingsBase.Upgrade()未升级用户设置

使用.NET 4.0重新编译后,ApplicationSettingsBase.Upgrade()未升级用户设置
EN

Stack Overflow用户
提问于 2010-04-27 22:49:42
回答 3查看 4K关注 0票数 9

我有一个使用标准ApplicationSettingsBase保存用户设置的C#程序。这在.NET 3.5下工作得很好。无论何时创建我的程序的新版本,所提供的Upgrade()方法都会正确地“重新加载”这些设置。

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

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

有没有一种方法可以让Upgrade()在切换框架时工作?我还遗漏了什么吗?

EN

回答 3

Stack Overflow用户

发布于 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)应用程序版本的表单加载事件的顶部:

代码语言:javascript
复制
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
票数 6
EN

Stack Overflow用户

发布于 2012-10-19 20:51:24

下面是代码。

代码语言:javascript
复制
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 );
        }
    }
}

希望这将对您有所帮助:)

票数 5
EN

Stack Overflow用户

发布于 2018-12-12 20:14:04

当Settings1.Upgrade()没有像您期望的那样工作时,可能会尝试删除以前的用户配置文件,然后重试。

在我的例子中,发布和调试版本是不相关的,那么升级似乎失败了,因为与调试/发布输出相关的同一目录中的版本之间存在冲突。

清除所有以前的用户配置文件(appdata\local....)似乎解决了这个问题,调用Upgrade()就行了,这里提出的变通方法也行得通。

我希望它能为你工作。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2722209

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档