更改程序集/文件版本后保留用户设置
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
怎么办?你会建议只使用某种本地配置文件吗?以上是关于更改程序集/文件版本后保留用户设置的主要内容,如果未能解决你的问题,请参考以下文章