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

hc8w905p  于 2022-11-16  发布在  其他
关注(0)|答案(3)|浏览(125)

背景

我有一个用C#编写的简单WinForms应用程序。我讨论了一段时间的部署解决方案,但最终决定放弃ClickOnce,因为一些约束是至关重要的限制。
相反,我采用了一种简单的解决方案,即通过程序集/文件版本对应用程序进行版本控制(我使它们保持同步)。我正在通过安装项目进行部署(*.msi)。我将最新的程序集版本号以及最新的安装程序文件联机存储在一个XML文件中。在运行时,我只是根据最新的在线版本检查Application.ProductVersion,如果有可用的更新,则打开更新对话框。

问题

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

建议的解决方案

我不知道该怎么做。到目前为止,这个应用程序只有一个版本,目前的用户群基本上是我可以乞求谁来测试它,所以切换策略没有什么大不了的。我考虑过:
1.)编写我自己的设置系统,从而完全控制设置文件的存储和使用位置/方式。
2.)重新考虑我的版本控制/更新策略,以便更新不基于程序集版本。我不确定我将如何做到这一点,但我的测试似乎表明,即使使用相同的程序集版本构建和安装新版本,也仍然会破坏user. config。
我想我真正想问的是,是否有任何方法可以保留默认设置系统,因为它很容易使用,同时也适应我的部署策略。

dgenwo3n

dgenwo3n1#

使用内置的设置类,您只需在更改应用程序版本时升级设置即可。具体操作如下:在Settings.settings文件中,创建一个新的设置UpdateSettings type=bool Scope=User Value=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为True,我们会从旧设定升级设定,然后保存在新的应用程序版本下。

fjnneemd

fjnneemd2#

我是这么解决的。
在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时,它将始终执行。
希望这对你有帮助!

roqulrg3

roqulrg33#

我更喜欢这种不需要额外设置Settings.Default.UpdateSettings的替代方案

string configPath = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.PerUserRoamingAndLocal).FilePath;
if (!File.Exists(configPath))
{
    //Existing user config does not exist, so load settings from previous assembly
    Settings.Default.Upgrade();
    Settings.Default.Reload();
    Settings.Default.Save();
}

相关问题