.net 为什么我的应用程序设置没有持久化?

s5a0g9ez  于 2022-11-26  发布在  .NET
关注(0)|答案(5)|浏览(145)

因此,我有一些属于user范围的设置,但由于某种原因,它们没有保存到.exe.config文件中。

Properties.Settings.Default.Email = "new@value.com";
Properties.Settings.Default.Save();

然而我查看debug文件夹中的设置文件,它仍然是我在visual studio中设置的默认值。我这样做错了吗?

yv5phkfx

yv5phkfx1#

用户设置是特定于用户的,因此它们不会被保存回. exe.config文件,该文件是系统范围的。
来自LocalSettingsProvider的文档:
应用程序范围的设定和预设使用者范围的设定会储存在名为application.exe.config的档案中,该档案与可可执行建立在相同的目录中。应用程序组态设定是只读的。特定的使用者数据会储存在名为username.config的档案中,该档案储存在使用者的主目录下。
因此,对于UserSettingsTest应用程序,只需在调试器下从VS运行(因此有vshost位),我最终得到的路径为:

C:\Users\Jon\AppData\Local\UserSettingsTest
  \UserSettingsTest.vshost.e_Url_pdqoppugkz1vaawbhwkkcu5ibxpi2fgu
  \1.0.0.0\user.config
wj8zmpe1

wj8zmpe12#

如果您将程序集信息设置为自动生成任何版本号(1.0.*),则每次调试应用时,版本号都将不同,因此每次都将创建一个新文件。
如果是这种情况,您将需要对设置文件执行升级:

Properties.Settings.Default.Upgrade()

您还可以将NeedsUpgrading的设置默认设置为true,并在执行升级后将其设置为false,以便每次启动应用程序时不更改版本号的最终用户不会一直升级

mftmpeh8

mftmpeh83#

所有用户范围设置都保存在应用程序数据下,位于一个文件夹中,该文件夹指示应用程序的版本和名称。
您可以通过在“应用程序设置”对话框中单击“同步”来查看这些文件夹。
通常在Vista中:

  • c:\users[当前用户]\应用程序数据\本地[公司名称][应用程序名称]\版本
  • c:\users[当前用户]\应用程序数据\漫游[公司名称][应用程序名称]\版本

这样做是因为设置与当前用户UAC有关。在Vista中,您还可以看到甚至应用程序范围的设置也没有存储在配置文件中。
[CompanyName]和[ProductName]来自您的程序集信息设置。

bq3bfh9z

bq3bfh9z4#

我发现当运行调试版本时,它总是重建并自动递增版本。新版本希望用户.config文件在C:\Users\Adrian\AppData\Local\Company\Project\Version中。由于这是一个新版本,该文件不存在,我又得到了默认值。您可以通过更改设置、保存,然后再次手动运行exe(在bin\debug...文件夹中)来检查这一点。如果这是您的问题,那么它会记住您的更改。
若要修正这个问题,您可以使用Settings.Default.Upgrade()方法。这个方法的潜在问题是,如果您每次执行它,它总是会以旧的设定取代您最近的设定。
解决方案使用设置编辑器添加新设置:

SettingsHaveBeenUpgraded : bool : User : false

在Program.cs Main()中,加入:

if (!Settings.Default.SettingsHaveBeenUpgraded)
    {
        Settings.Default.Upgrade();
        Settings.Default.SettingsHaveBeenUpgraded = true;
    }

这将确保升级仅发生一次。

vmpqdwk3

vmpqdwk35#

“用户”定义的设置与“应用程序”定义的设置沿着记录在app.config中。然而,实际上,“用户”命名的设置是一个用词不当且容易误导。它们应该被称为“默认用户”设置。
当新用户访问应用程序时,默认情况下,将为他们分配“用户”设置。
如果用户设置与位于app.config文件中的“默认用户”设置不同,则仅将用户设置保存到实际用户的user.config设置文件中。

相关问题