Settings.Default.Upgrade() 不保留当前设置

Settings.Default.Upgrade() does not keep current settings

提问人:Cleo 提问时间:10/24/2016 最后编辑:Cleo 更新时间:7/11/2023 访问量:3013

问:

我有一个使用内置设置功能的 WPF 应用程序。当我发布应用程序的新版本时,我会增加程序集版本,并在应用程序启动时执行以下代码:

if (Settings.Default.IsSettingsUpgradeRequired) //this defaults to true when a new version of this software has been released
            {
                Settings.Default.Upgrade(); //upgrade the settings to the newer version
                Settings.Default.Reload();
                Settings.Default.IsSettingsUpgradeRequired = false;
                Settings.Default.LastSettingsUpdate = DateTime.Now.ToShortDateString() + " " + DateTime.Now.ToShortTimeString();
                Settings.Default.Save();
            }

问题是没有保留以前的设置。相反,每次出现新版本时,都会在 \AppData\Local\ 下创建一个新文件夹。因此,将使用默认设置,而不是以前版本的设置。我知道,在正常情况下,应该有一个文件夹包含许多子文件夹,其名称为应用程序的版本。相反,我有许多文件夹,每个文件夹只包含一个以应用程序版本为名称的文件夹。 Local\ 中的文件夹结构如下所示:

  • myApp.exe_Url_5s2axp5sywfyhblm3201qetpqnmwnvsc
  • myApp.exe_Url_ft4ih1ze0qsz5abu11t334omxo1431c0
  • myApp.exe_Url_glsc2d3cjmswry2bxebb53jndfptav1x
  • myApp.exe_Url_qngn1rqmbfyy42fdgpmc3ystsaknuxnv
  • myApp.exe_Url_vqn0ogftrchl1fild5fe34hmijvmd2zr

那么,如何停止系统创建如此多的文件夹,并使其每个应用程序仅使用一个文件夹,以便我可以正确升级我的设置呢?

编辑:我今天注意到的另一件事是,如果我更改应用程序文件夹的位置(例如将其从桌面移动到 C:\myApp),应用程序会在首次启动时创建一个新的设置文件夹。为什么系统无法将其识别为同一应用程序?

C# 设置 升级

评论

0赞 Matthew Watson 10/24/2016
我没有在用于更新设置的代码中使用,它工作正常。 尝试删除它。Reload()
0赞 Cleo 10/24/2016
已经尝试过了,不会改变任何事情。问题是系统为每个软件版本创建一个新的应用程序文件夹,因为它无法识别它是同一个应用程序......
0赞 Cleo 11/4/2016
也许它与有/没有清单文件有关?或者我可能需要在申请表上签名?
1赞 miguelmpn 5/8/2020
您是如何添加 IsSettingsUpgradeRequired 的?

答:

3赞 Cleo 3/29/2017 #1

我终于让它工作了。我不知道这种行为的原因,但以下两件事之一解决了它:

  • 添加了默认清单文件并更改了“assemblyIdentity”节点(“version”属性似乎对设置没有影响)
  • 激活了 Visual Studio 的签名功能(项目属性 --> 签名)

评论

0赞 mrid 1/5/2022
您在 assemblyIdentity 中更改了什么?
0赞 Cleo 1/7/2022
@mrid:没什么特别的,就这样设置:<assemblyIdentity version=“1.0.2.2” name=“MyCompany.ApplicationName”/>
0赞 Dmitry 4/24/2020 #2

项目 -> 属性 -> 应用程序 -> 清单 = 使用默认设置嵌入清单

0赞 empax 4/19/2022 #3

@cleo 感谢您的解决方案。签名解决了这个问题。文件夹名称不再更改。

\AppData\Local\MyAppName.exe_StrongName_iyq1qat10dlrezghdzsmthpr49hlodkj

enter image description here

评论

0赞 Dan Harms 4/23/2022
请不要添加“谢谢”作为答案。相反,投票选出您认为有用的答案。- 从评论
0赞 tolsen64 5/3/2022 #4

我正在使用 .NET6 在 2022 年,只是在应用程序启动期间添加它对我有用:

Settings.Default.Upgrade();
1赞 xuleilei 7/11/2023 #5

激活的签名将确保在

\AppData\Local\

在应用程序启动后也必须执行Settings.Default.Upgrade()

0赞 Roger Wolf 12/19/2023 #6

有点晚了,但为了完整起见:

我不确定以前的版本是如何处理的,但是当我将我的 Winforms 应用程序迁移到 .NET 8 时,它被破坏了,其他答案中提到的内容都没有帮助。Settings.Default.Upgrage()

就我而言,看似罪魁祸首是该应用程序同时使用本地和漫游设置,因此在不同的文件夹中创建了 2 个文件。这在某种程度上干扰了设置升级。user.config

将所有设置(用户级别和应用程序级别)更改为 后,Visual Studio 以无提示方式将文件添加到项目中,并且设置开始正确升级。从技术上讲,我仍然不确定是缺少文件还是设置的存在,但无论哪种方式,它都修复了它们。Localapp.configapp.configRoaming

HTH型