.NET桌面应用程序中的Settings.settings与app.config

时间:2011-09-17 16:41:52

标签: .net app-config settings.settings

  

可能重复:
  What is the difference between app.config file and XYZ.settings file?

我对Visual Studio中这两种机制的明显冗余感到困惑,以存储和管理桌面应用程序设置:

  • 您可以使用XML app.config文件,将项目添加到<appSettings>部分。可以使用ConfigurationManager类从代码中检索这些内容。
  • 或者,您可以使用Settings.settings文件通过编辑器添加单个设置。 Visual Studio将生成Settings类,以便在运行时对类型安全的设置进行检索。

这两种机制似乎服务于相同(或几乎相同)的目的。我知道存在一些差异,但我也对重叠及其后果感到困惑。例如,当我使用Visual Studio向Settings.settings文件添加设置时,我输入的所有信息最终都会作为app.config文件中的条目。显然,存在同步机制:如果我更改app.config文件中的设置,Visual Studio会在下次在编辑器中打开时提示我更新Settings.settings文件。

我的问题是:

  • 为什么有两种机制,而不仅仅是一种?
  • 使用app.config超过Settings.settings的最常见方案是什么,反之亦然?
  • 如果我的应用使用Settings.settings并在部署后更改app.config中的值,会发生什么情况? Settings.settings不会发生同步,因为它已经被编译和分发。

请注意。我已经搜索了关于这个主题的问题,但我更加困惑。例如,this question here的答案相当矛盾,并没有太多亮点。

注意2.我知道app.config是设计时文件名,我熟悉Visual Studio复制的动态并将其重命名为可执行文件夹。

2 个答案:

答案 0 :(得分:48)

  

为什么有两种机制而不仅仅是一种?

它们用于不同的目的。设置API提供应用程序的读/写访问权限,而配置是只读的(除非您在代码中编写文件)。

可以按用户或每个应用程序定义设置,并且设计为易失性。用户设置将写入UAC下允许的用户配置文件存储中的隐藏文件夹。

App.config仅适用于每个应用程序。不会自动获取对App.config的更改。它需要重新启动或代码来刷新值。在UAC下,不允许用户写入程序文件等应用程序目录,因此该文件应被视为静态只读。

  

使用app.config最常见的场景是什么?   Settings.settings,反之亦然?

您可以在桌面应用程序中使用“设置”来存储用户首选项或在运行时更改的设置。

您可以将App.config用于更通用的静态设置,例如连接字符串等,或者用于定义应用中使用的组件的配置。

  

如果我的应用正在使用Settings.settings并且我更改了a,会发生什么   部署后app.config中的值是什么?

如果重新部署应用程序,那么它将获取新设置,除非机器上已经有用户/应用程序自定义,在这种情况下它将继续使用它们,除非您擦除它们。

如果您添加新设置,则会获取这些设置。实际上,默认值会被添加到Settings类中,因此即使app.config为空,“设置”仍会起作用。

答案 1 :(得分:27)

从.NET Framework的角度来看(目前还没有谈到工具 - Visual Studio),历史上只有[app.exe].config(实际上,这是AppDomain定义为配置文件的内容。名称由AppDomain定义,这就是为什么它对于网络应用程序来说是web.config ...)和machine.config。 'app'与应用程序一起部署,'machine'用于整个机器。对于普通用户来说,它们应该是“完全”只读的。可以改变它们,但这不是主意。

但是如何保存最终用户偏好呢?这就是[user] .config被引入的原因(我相信.NET 2)。官方文件说:

  

最初与.NET一起发布的配置系统   Framework支持提供静态应用程序配置数据   通过本地计算机的machine.config文件或在   随应用程序一起部署的app.exe.config文件。该   LocalFileSettingsProvider类扩展了此本机支持   以下方式:

     

1)应用程序范围的设置可以存储在machine.config中   或app.exe.config文件。 Machine.config始终是只读的,而   安全注意事项将app.exe.config限制为只读   对于大多数应用程序。

     

2)用户范围的设置可以存储在app.exe.config文件中,其中   如果将它们视为静态默认值。

     

3)非默认用户范围设置存储在新文件中,   user.config,其中user是当前人员的用户名   执行申请。您可以为用户范围指定默认值   使用DefaultSettingValueAttribute进行设置。因为用户范围   设置经常在应用程序执行期间更改,user.config是   总是读/写。

因此,从.NET Framework的角度来看,只有一个3层机制。

现在,Visual Studio只是尝试为最终的读/写设置生成类型安全的代码来帮助您。大多数情况下,[user] .config文件不存在,设置值将由DefaultSettingValueAttribute(为每个设置定义)中的内容定义,或者使用app.config中静态定义的内容。这就是为什么Visual Studio还会更新app.config文件,以便您可以为设置定义静态默认值。但你可以完全删除所有app.config的东西。