如何保持.NET中的不同程序集版本的user.config设置?

基本上问题是,每次程序集版本改变(即用户安装新版本的应用程序),他们的所有设置都被重置为默认值(或者更确切地说,新的user.config文件是在具有不同版本的文件夹中创build的号码作为名字)

升级版本时如何保持相同的设置,因为使用ini文件或registry似乎不鼓励?

当我们使用Clickonce时,它似乎能够处理这个问题,所以看起来应该可以完成,但我不知道如何。

ApplicationSettingsBase有一个名为Upgrade的方法 ,用于迁移以前版本的所有设置。

为了在发布应用程序的新版本时运行合并,您可以在设置文件中定义一个默认为true的布尔标志。 将其命名为UpgradeRequired或类似的东西。

然后,在应用程序启动时检查标志是否设置,如果是,请调用Upgrade方法 ,将标志设置为false并保存您的configuration。

if (Settings.Default.UpgradeRequired) { Settings.Default.Upgrade(); Settings.Default.UpgradeRequired = false; Settings.Default.Save(); } 

阅读有关MSDN上升级方法的更多信息。 GetPreviousVersion也值得一看,如果你需要做一些自定义合并。

如果您对user.settings的更改是以编程方式完成的,那么如何在单独的文件(例如user.customized.settings)中维护对user.settings的修改(仅)的修改呢?

您可能仍然希望在user.settings中维护和加载修改后的设置。 但是,通过这种方式,当您使用较新版本的user.settings安装较新版本的应用程序时,您可以询问用户是否希望通过将其修改后的设置复制回新的user.settings来继续使用它们。 你可以批量导入它们,也可以让它更加奇特,并要求用户确认他们想要继续使用的设置。

编辑:我读得太快,通过“更准确”部分关于程序集版本导致一个新的user.settings被安装到一个新的版本特定的目录。 因此,上面的想法可能不会帮助你,但可能提供一些思考的食物。

这是我处理它的方式:

 public virtual void LoadSettings(ServiceFileFormBaseSettings settings = null, bool resetSettingsToDefaults = false) { if (settings == null) return; if (resetSettingsToDefaults) settings.Reset(); else { settings.Reload(); if (settings.IsDefault) settings.Upgrade(); } this.Size = settings.FormSize; 

}

并在设置类中,我定义了IsDefault属性:

 // SaveSettings always sets this to be FALSE. // This will have the default value TRUE when first deployed, or immediately after an upgrade. // When the settings exist, this is false. // [UserScopedSettingAttribute()] [DefaultSettingValueAttribute("true")] public virtual bool IsDefault { get { return (bool)this["IsDefault"]; } set { this["IsDefault"] = value; } } 

在SaveSettings中,我将IsDefault设置为false:

 public virtual void SaveSettings(ServiceFileFormBaseSettings settings = null) { if (settings == null) // ignore calls from this base form, if any return; settings.IsDefault = false; settings.FormSize = this.Size; settings.Save(); } 

我知道这是一段时间…在一个winforms应用程序,只需调用My.Settings.Upgrade()之前加载它们。 这将获得最新的设置,无论是当前版本还是以前的版本。

以下是我的研究,以防其他人在迁移已更改/删除的设置时遇到困难。 基本问题是,如果您已经重命名或删除了新版本的应用程序中的设置,则GetPreviousVersion()不起作用。 所以你需要在你的Settings类中保留这个设置,但是添加一些属性/构件,这样你就不会在其他地方的代码中不经意地使用它,从而使它成为废弃的。 一个样例过时的设置在VB.NET中看起来像这样(可以很容易地转换为C#):

 <UserScopedSetting(), DebuggerNonUserCode(), DefaultSettingValue(""), Obsolete("Do not use this property for any purpose. Use YOUR_NEW_SETTING_NAME instead."), NoSettingsVersionUpgrade()> Public Property OldSettingName() As String Get Throw New NotSupportedException("This property is obsolete") End Get Set Throw New NotSupportedException("This property is obsolete") End Set End Property 

确保将此属性添加到具有应用程序设置的相同命名空间/类。 在VB.NET中,这个类被命名为MySettings并在My命名空间中可用。 您可以使用部分类function来防止将过时的设置与您当前的设置混合在一起。

充分感谢jsharrison发表关于这个问题的优秀文章 。 你可以阅读更多关于它的细节。