繁体   English   中英

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

[英]ApplicationSettingsBase.Upgrade() Not Upgrading User Settings after Recompiling with .NET 4.0

我有一个 C# 程序,它使用标准的ApplicationSettingsBase来保存其用户设置。 这在 .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) 应用程序版本的表单 Load 事件的顶部:

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

这是代码。

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 );
        }
    }
}

可能这会帮助你:)

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

在我的情况下,发布和调试版本不相关,然后升级似乎失败,因为与调试/发布输出相关的同一目录中的版本之间存在冲突。

清除所有以前的用户配置文件 (appdata\\local....) 似乎解决了问题,调用 Upgrade() 工作并且这里提出的解决方法工作。

我希望这个对你有用。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM