我有一些用户范围的设置,但由于某些原因,它们未保存到 .exe.config 文件中。我按照以下步骤进行操作:
Properties.Settings.Default.Email = "new@value.com";
Properties.Settings.Default.Save();
然而我查看调试文件夹中的设置文件,发现它仍然是我在Visual Studio中设置的默认值。我做错了吗?
我有一些用户范围的设置,但由于某些原因,它们未保存到 .exe.config 文件中。我按照以下步骤进行操作:
Properties.Settings.Default.Email = "new@value.com";
Properties.Settings.Default.Save();
然而我查看调试文件夹中的设置文件,发现它仍然是我在Visual Studio中设置的默认值。我做错了吗?
用户设置是特定于用户的,因此它们不会保存回系统范围内的.exe.config文件。
从LocalSettingsProvider
的文档中可以看到:
应用程序范围的设置和默认的用户范围的设置存储在一个名为application.exe.config的文件中,该文件创建在可执行文件所在的同一目录中。应用程序配置设置是只读的。特定用户数据存储在一个名为
username.config
的文件中,存储在用户的主目录下。
因此,对于仅在调试器下从VS运行的UserSettingsTest应用程序(因此包括vshost部分),我最终得到了以下路径:
C:\Users\Jon\AppData\Local\UserSettingsTest
\UserSettingsTest.vshost.e_Url_pdqoppugkz1vaawbhwkkcu5ibxpi2fgu
\1.0.0.0\user.config
如果您的程序集信息设置为自动生成任何版本号(1.0.*),那么每次调试应用程序时,版本号都会不同,并且每次都会创建一个新文件。
如果是这种情况,您需要升级设置文件:
Properties.Settings.Default.Upgrade()
您还可以默认设置 NeedsUpgrading
为 true
,并在执行升级后将其设置为 false,这样不会经常改变应用程序版本号的最终用户就不会一直升级。
我发现在运行调试版本时,它总是重新构建并自动增加版本号。新版本期望用户配置文件位于C:\Users\Adrian\AppData\Local\Company\Project\Version。由于这是一个新版本,该文件不存在,因此我又得到了默认值。您可以通过更改设置、保存,然后手动再次运行exe文件(在bin\debug\...文件夹中)来检查此问题。如果这是您的问题,则它将记住您的更改。
要解决此问题,您可以使用Settings.Default.Upgrade()
方法。这样做的潜在问题是,如果每次运行它,它都会用旧的设置替换您最近的设置。
解决方案 使用设置编辑器添加一个新设置:
SettingsHaveBeenUpgraded : bool : User : false
if (!Settings.Default.SettingsHaveBeenUpgraded)
{
Settings.Default.Upgrade();
Settings.Default.SettingsHaveBeenUpgraded = true;
}
这将确保升级仅发生一次。
“用户”定义的设置与“应用程序”定义的设置一起记录在app.config文件中。实际上,“用户”命名的设置是一个误称且相当具有误导性。它们应该被称为“默认用户”设置。
当新用户访问应用程序时,默认情况下将分配“用户”设置。
仅当用户设置与位于app.config文件中的“默认用户”设置不同时,才会将用户设置保存到实际用户的user.config设置文件中。