App.config:用户范围 vs 应用程序范围

101

我已经在我的项目中添加了App.config文件。 我从“项目”>“属性”>“设置”面板中创建了两个设置 -

enter image description here

我注意到当我添加设置时,可以将作用域定义为UserApplication。-

  1. User
  2. Application

如果我将设置定义为User,它会进入userSettings部分,
如果我将设置定义为Application,它会进入applicationSettings部分。

App.config

<configuration>

    <userSettings>
        <DemoApp.Properties.Settings>
            <setting name="MySetting1" serializeAs="String">
                <value>Value1</value>
            </setting>
        </DemoApp.Properties.Settings>
    </userSettings>

    <applicationSettings>
        <DemoApp.Properties.Settings>
            <setting name="MySetting2" serializeAs="String">
                <value>Value2</value>
            </setting>
        </DemoApp.Properties.Settings>
    </applicationSettings>

</configuration>

但是,这些设置可以通过同样的方式从 .cs 访问 -

代码

string mySetting1 = DemoApp.Properties.Settings.Default.MySetting1;
string mySetting2 = DemoApp.Properties.Settings.Default.MySetting2;

什么是UserApplication作用域之间的区别,以及在什么情况下应该选择这两个之间的哪一个?

2个回答

85

基本上,在程序运行期间无法更改应用设置,但可以更改用户设置。 然后应保存这些用户设置,以便下次用户运行应用程序时呈现熟悉的体验。

编辑: 例如,您可能会编写具有不同模块的应用程序,并需要确保您的主要模块正在使用正确的安全模块版本。 为此,您将设置应用程序范围设置,例如:

SecurityModuleVersion  string     Application      v1.21

在未来进行安全模块的重构时,可能会在部署时将值更改为v1.22,以确保正确实施了安全性。

另一方面,如果您的应用程序具有不同的“皮肤”,包括颜色更改、字体更改等,则可以设置用户设置,如下所示:

ApplicationSkin        string     User              DefaultSkin

接着,当Michelle更改为她喜欢的皮肤时,该应用程序会记住她的设置。现在属性可能看起来像:

ApplicationSkin        string     User              HelloKittySkin

你能否举个例子来解释一下? - Parag Meshram
1
默认设置在配置文件中,是吗?但用户保存的设置存储在哪里? - Kyle Delaney
10
应用程序的设置被保存在 *.exe.config 文件中。用户设置会被保存在 c:\users<userid>\AppData\Local<companyname><appname><version>\user.config(其中后面的内容来自程序集文件)。在加载时,用户设置优先于应用程序设置。 - Schrodo_Baggins
@Schrodo_Baggins,似乎.exe.config文件中的用户设置被用作user.config的默认值。 - Nyerguds

75
应用程序范围的设置是只读的,只能在设计时更改或通过在应用程序会话之间更改.exe.config文件来更改。然而,用户范围的设置可以在运行时编写,就像更改任何属性值一样。新值在应用程序会话期间持续存在。您可以通过调用Settings.Save方法将更改持久保存在应用程序会话之间的用户设置中。
msdn上的源代码:使用C#中的设置 用户设置通常用于保留用户首选项(例如应用程序通知首选项等)。应用程序设置通常用于诸如API密钥等项目。
如@kmote所指出的,当在运行时修改并持久保存用户设置(通过settings.Save()),它们将被写入用户配置文件夹中(通常为Windows 7及以上版本中的C:\Users\Username\AppData\Local\AppName)。为了以编程方式确定文件位置,请参见此帖子

任何实时示例都将不胜感激 - Parag Meshram
1
还应指出,在会话之间编辑.config文件无法更改用户设置。 - kmote
@kmote 当然可以!如果会话已关闭,您可以更改配置(因此也更改了用户设置)。更改将持久保存,并在您再次启动会话时反映在程序中...我刚刚测试过。 - Riegardt Steyn
5
@Heliac: 我应该更加精确。你是正确的,userSettings可以在会话之间进行更改。然而,一旦你通过Settings.Save()在程序中对它们进行了编程更改,就会创建一个_新的_配置文件,并且被隐藏/埋藏在C:\Users[用户名]\AppData\Local\Microsoft中。从那时起,每当启动应用程序时,用户设置将仅从该文件中提取,并且在App.config或Settings.settings中手动进行的任何更改都将被忽略。 - kmote
有没有办法找到并查看此用户配置文件的内容? - Kyle Delaney
请参见 https://dev59.com/rXNA5IYBdhLWcg3wI6R4,该问题与使用.NET中的设置文件时配置实际存储位置有关。 - SpruceMoose

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接