Settings.Settings与.NET桌面应用程序中的app.config之比较



可能重复:
app.config文件和XYZ.settings文件之间有什么区别?

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

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

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

我的问题是:

  • 为什么有两种机制而不仅仅是一种
  • 使用app.config而不是Settings.settings最常见的场景是什么,反之亦然
  • 如果我的应用程序正在使用Settings.settings,并且在部署后我更改了app.config中的值,会发生什么?Settings.settings不可能同步,因为它已经被编译和分发了

注意。我一直在寻找这个话题的问题,但我更困惑。例如,这里对这个问题的回答是非常矛盾的,并没有提供太多的线索。

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

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

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

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

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

使用app.config的最常见场景是什么设置。设置,反之亦然

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

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

如果我的应用程序正在使用Settings.Settings,而我更改了app.config中的值

如果应用程序被重新部署,它将接受新的设置,除非机器上已经有用户/应用程序自定义,在这种情况下,它将继续使用这些设置,除非你删除它们。

如果添加新设置,这些设置将被选中。事实上,默认值被烘焙到Settings类中,因此即使app.config为空,Settings仍然起作用。

来自。NET Framework的观点(暂时不说工具-Visual Studio(,历史上只有[app.exe].config(事实上,这就是AppDomain定义的配置文件。名称由AppDomain定义,这就是为什么web应用程序是web.config…(和machine.config。"应用程序"与应用程序一起部署,"机器"用于整个机器。对于普通用户来说,它们应该是"完全"只读的。改变它们是可能的,但这不是我们的想法。

但是,我如何保存最终用户的偏好呢?这就是引入[user].config的原因(我相信在.NET2中(。官方文件上写着:

最初随发布的配置系统。NET框架支持提供静态应用程序配置数据通过本地计算机的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框架的角度来看,只有一个三层机制。

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

最新更新