更改程序集/文件版本后保留用户设置

Posted

技术标签:

【中文标题】更改程序集/文件版本后保留用户设置【英文标题】:Keep user's settings after altering assembly/file version 【发布时间】:2014-07-18 10:02:21 【问题描述】:

背景 我有一个用 C# 编写的简单 WinForms 应用程序。我讨论了一段时间的部署解决方案,但最终决定放弃 ClickOnce,因为其中一些限制非常严格。

相反,我采用了一个简单的解决方案,即通过应用程序属性中的程序集/文件版本(我使它们保持同步)对应用程序进行版本控制。我正在通过安装项目 (*.msi) 进行部署。我在线将最新的程序集版本号以及最新的安装程序文件存储在 XML 文件中。在运行时,我只需根据在线最新版本检查 Application.ProductVersion,如果有可用更新,则打开更新对话框。

问题 到目前为止,这工作得很好,但我最近注意到这种方法的一个主要问题。更新应用程序的程序集版本时,会在 AppData/Company/Product/Version/blahblahblah 中创建新版本的用户设置文件 (user.config)。这显然会迫使用户在新版本中重置所有内容。

建议的解决方案 我不确定如何进行。到目前为止,该应用程序只有 1 个版本,当前的用户群基本上是我可以乞求测试它的任何人,所以切换策略没什么大不了的。我考虑过:

1.) 编写我自己的设置系统,从而完全控制设置文件的存储和使用位置/方式。 2.) 重新考虑我的版本控制/更新策略,以便更新不基于程序集版本。我不确定我会如何做到这一点,但我的测试似乎表明,即使构建和安装具有相同程序集版本的新版本仍然会破坏 user.config。

我想我真正想问的是是否有任何方法可以保留默认设置系统,因为它非常易于使用,同时还可以适应我的部署策略。

【问题讨论】:

您可以将旧设置文件复制到新位置吗? 我考虑过这条路线,但我担心监控安装了哪些以前的版本会有点混乱,特别是如果用户跳过了几个版本。 【参考方案1】:

我是这样解决的。

在 GUI 应用程序中,很容易通过执行来恢复设置

Properties.Settings.Default.Upgrade();
Properties.Settings.Default.Reload();
Properties.Settings.Default.Save();

但是,我一直遇到的问题是,在安装新版本时,所有其他库都会丢失其设置。通过以下实现,软件将运行 AppDomain 的所有程序集并恢复相应库的设置:

foreach(var _Assembly in AppDomain.CurrentDomain.GetAssemblies())

    foreach(var _Type in _Assembly.GetTypes())
    
        if(_Type.Name == "Settings" && typeof(SettingsBase).IsAssignableFrom(_Type))
        
            var settings = (ApplicationSettingsBase)_Type.GetProperty("Default").GetValue(null, null);
            if(settings != null)
            
                settings.Upgrade();
                settings.Reload();
                settings.Save();
            
        
    

我在 GUI 项目的 App.xaml.cs 中实现了代码,当新版本将设置“NewVersionInstalled”设置为 true 时,它​​将始终执行。

希望这会有所帮助!

【讨论】:

【参考方案2】:

使用内置的设置类,您只需在更改应用程序版本时升级设置。以下是如何做到这一点: 在 Settings.settings 文件中,创建一个新设置 UpdateSettings type=bool Scope=用户值=True

在使用任何设置之前包含以下代码(它可以在应用程序每次运行时运行,因为这也使得在调试器中运行更容易)

// Copy user settings from previous application version if necessary
if (MyApp.Properties.Settings.Default.UpdateSettings)

    MyApp.Properties.Settings.Default.Upgrade();
    MyApp.Properties.Settings.Default.UpdateSettings = false;
    MyApp.Properties.Settings.Default.Save();

当您的新应用程序版本运行时,UpdateSettings 将具有默认值 True,并且不会使用您的任何旧设置。如果 UpdateSettings 为真,我们会从旧设置升级设置,然后保存在新应用版本下。

【讨论】:

哇,我完全不知道 UpdateSettings() 方法。感谢您指出了这一点!该解决方案在我的测试环境中运行良好。 @SeeSharpCode 您的意思是 Upgrade() 方法。 UpdateSettings 是您必须自己定义的设置。 我不是 WinForms 开发人员,所以如果这是一个微不足道的问题,请原谅...如果 UpdateSettings() == false 怎么办?你会建议只使用某种本地配置文件吗?

以上是关于更改程序集/文件版本后保留用户设置的主要内容,如果未能解决你的问题,请参考以下文章

更改另一个 .EXE 的程序集版本

如何检查程序集是不是已更改

卸载 appdomain 后程序集仍然存在

如何更改nuget包程序集版本

Azure DevOps Build Pipeline:如何仅为更改的程序集增加程序集版本?

tlbimp 如何用于指定不同的文件和程序集版本?