2010-03-19 90 views
28

我创建了一个应用程序,它使用settings.settings来存储一些用户特定的设置(scope = User)。设置在启动时正确加载,在使用过程中更改并正确保存以便下次启动。这个循环似乎没有问题。如何通过文件版本更改在.settings/.config文件中保留更改?

的问题出现了,当我更新装配和文件版本,新的版本。这些设置在启动时不再加载(取而代之的是使用默认值)。它也似乎从版本1.1保存的配置文件将保留,即使1.2版本启动,并且一个新的配置文件也被生成并保存(也就是说,您可以重新启动版本1.1并且配置文件将是从该文件保存的配置文件版)。

所以看来,设置特定的装配和/或文件的版本。还值得注意的是,在1.1版和1.2版之间,settings.settings文件或其他任何内容都没有发生变化(即我在这些不同版本之间进行的唯一更改是修改版本号)。

是否有办法在版本更改中保留这些设置?

+0

[保留升级设置](https://stackoverflow.com/questions/534261/how-do-you-keep-user-config-settings-across-different-assembly-versions-in-net/534335# 534335)可能是使用.Net Settings类时的另一个挑战。这篇文章开头的链接有答案。 – 2011-04-15 00:13:52

+0

我在[此线程](https://stackoverflow.com/a/47921377/3223783)中发布了可能的解决方案。希望有所帮助! – dontbyteme 2017-12-21 09:00:17

+0

我已经在以下线程中发布了可能的解决方案:https://stackoverflow.com/a/47921377/3223783希望有所帮助! – dontbyteme 2017-12-21 09:02:22

回答

18

马库斯·奥尔森已经给予了相当不错的答案here

从本质上讲,你将需要使用ApplicationSettingsBase.Upgrade()方法。

+0

谢谢您的信息!它现在已经编译,测试,按预期工作,现在已完全集成到项目中!当我可以的时候,我会奖励你的赏金(显然我必须等待接受这个答案 - 应该在今天晚些时候或明天)。 :D – InvertedAcceleration 2010-03-23 19:33:13

1

我希望别人有更好的答案。几年前我曾经有过这个问题,我能找到的唯一解决方案就是使用我自己的机制来存储设置,而不是默认的内置.NET方式。

+0

感谢您的经验切入...我被吹走了我现在没有一个答案是直接简单的(通过SO和我试图在文档中自己回答这个问题)。这让我相信这是不可能的...对于绝大多数项目几乎完全无用的节省时间的功能而言,这是疯狂的。 – InvertedAcceleration 2010-03-22 11:01:47

41

一些澄清:

你必须调用ApplicationSettingsBase派生类的Upgrade方法(通常被称为Settings和由Visual Studio为您创建):

Properties.Settings.Default.Upgrade(); 

当/在哪里请拨打Upgrade方法?您可以应用一个简单的技巧:定义名为UpgradeRequired(示例)的用户设置为bool(最简单的方法是通过IDE)。确保它的默认值是true

插入此代码的应用程序的启动剪断:

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

所以升级方法才会版本的变化被称为只有一次(因为你通过设置UpgradeRequired = false直到版本禁用进一步升级更改 - 当房产恢复默认值true)。

+2

除了'UpgradeRequired'之​​外,我会将应用程序的版本存储为设置。这允许您执行自定义升级转换(即将无效值/有效值转换为最新版本的默认值/相同值以外的值)。您可以拥有能够将需要转换的每个适用版本转换为需要它的下一个最低版本并将代码菊花链连接在一起的代码:a)降低最新版本转换代码的复杂性,并b)允许潜在退役旧转换代码。 – Tom 2017-05-05 20:08:08