升级应用程序时迁移用户级自定义设置

时间:2011-03-23 17:39:12

标签: .net config migrate

我有一个应用程序,它使用自定义配置部分进行用户级设置。它是以这种方式完成的,而不是使用设置文件,这样设置可以集中在程序的单个app.config中,而不是每个项目都有一个,这是设置文件的默认设置。

问题是这些自定义设置是每用户可配置的,并且在用户升级软件时会丢失(创建新版本的新文件夹,并且不再使用旧文件夹)。因此,我需要一种方法来在更新时或在升级后每个用户首​​次运行应用程序时迁移这些设置。我已经在Settings.Upgrade()上看到了这些信息,但这只适用于配置的“设置文件”部分。我查看了ConfigurationSection的文档(我的自定义设置类/部分从中派生)并且似乎没有任何帮助。使用ConfigurationManager从安装程序中提取用户设置以迁移它们似乎是一个死胡同,因为OpenExeConfiguration的重载不支持同时指定可执行文件和用户级别。

任何提示?存储的信息并不重要(主要是记住窗口几何和布局设置),但每次升级应用程序时都会丢失。我唯一能想到的是完全放弃这些设置的配置机制,并实现我自己的模型,将这些设置存储在用户的AppData中的版本无关文件中(我存储了一些其他用户特定的文件)。我宁愿这是最后一个选项,因为你放弃了app.config包装器而失去了很多。

2 个答案:

答案 0 :(得分:1)

您可能希望创建对更新期间保持原状的外部配置节文件的引用。使用configSource属性引用该文件。

这样,用户可以在更新app.config时保留其设置。

这是一篇相关的帖子:How to enable configSource attribute for Custom Configuration Section in .NET?

答案 1 :(得分:0)

这是一个老问题,但我会写一个答案,万一有人通过谷歌来到这里。

我通过强制记住以前版本的文件路径并使用旧文件覆盖新配置位置中的文件来“解决”此问题。

我确信这种方法存在许多缺陷,但如果您正在寻找可行的快速解决方案,那么您可能会觉得这很有用。

if (Settings.Default.IsNewVersion)
{
    Settings.Default.Upgrade();
    var targetConfigPath = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.PerUserRoamingAndLocal).FilePath;

    if (!string.IsNullOrWhiteSpace(Settings.Default.ConfigPath))
    {
        System.IO.File.Copy(Settings.Default.ConfigPath, targetConfigPath, true);
        Settings.Default.Reload();
    }

    Settings.Default.ConfigPath = targetConfigPath;
    Settings.Default.IsNewVersion = false;

    Settings.Default.Save();
}