4

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

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

有什么提示吗?存储的信息并不重要(主要是记住的窗口几何形状和布局设置),但每次升级应用程序时丢失可能会很烦人。我唯一能想到的就是完全放弃这些设置的配置机制,并实现我自己的模型,将这些设置存储在用户 AppData 中与版本无关的文件中(我在其中存储了一些其他用户特定的文件)。我希望这是最后的选择,因为放弃 app.config 包装器会损失很多。

4

2 回答 2

1

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

这样,当 app.config 更新时,用户可以保留他们的设置。

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

于 2011-05-30T10:16:10.400 回答
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();
}
于 2014-01-14T15:24:59.477 回答