在.NET桌面应用Settings.settings与app.config

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

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

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

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

我的问题是:

  • 为什么两个机制,而不只是一个?
  • Settings.settings使用app.config最常见的情况是什么,反之亦然?
  • 如果我的应用程序使用Settings.settings并且在部署后更改了app.config的值,会发生什么情况? Settings.settings不会同步,因为它已被编译和分发。

注意。 我已经在这个主题上寻找问题,但是我更加困惑。 例如, 这个问题的答案相当矛盾,并没有多less亮点。

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

从.NET Framework的angular度来看(不是说Visual Studio的工具 – 目前来说),历史上只有[app.exe].config (实际上,它是AppDomain定义的configuration文件)由AppDomain定义,这就是为什么它是Web应用程序的web.config …)和machine.config 。 'app'与应用程序一起部署,'machine'用于整个机器。 对于普通用户来说,它们应该是“相当”只读的。 有可能改变它们,但这不是主意。

但是,我怎样才能保存最终用户的喜好呢? 这就是为什么[用户] .config被引入(我相信与.NET 2)。 官方文件说这个:

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

1)应用程序范围的设置可以存储在machine.config或app.exe.config文件中。 Machine.config始终为只读,而app.exe.config受安全考虑因素的限制,只能读取大多数应用程序。

2)用户范围设置可以存储在app.exe.config文件中,在这种情况下,它们被视为静态默认值。

3)非默认的用户范围设置存储在一个新的文件user.config中,其中用户是当前正在执行应用程序的用户的用户名。 您可以使用DefaultSettingValueAttribute指定用户范围设置的默认值。 由于用户范围设置在应用程序执行过程中经常发生变化,因此user.config始终是可读/写的。

所以从.NET Framework的angular度来看,只有一个3层机制。

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

为什么两个机制,而不只是一个?

他们服务不同的目的。 设置API提供对应用程序的读/写访问,而configuration是只读的(除非您以代码forms编写文件)。

可以为每个用户或每个应用程序定义设置,并devise为易失性。 用户设置被写入UAC允许的用户configuration文件存储器中的隐藏文件夹。

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

在Settings.settings上使用app.config最常见的情况是什么,反之亦然?

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

您可以使用App.config来获取更多的通用静态设置,比如连接string等,或者定义应用程序中使用的组件的configuration。

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

如果应用程序被重新部署,那么它将select新的设置,除非在计算机上已经有用户/应用程序定制,在这种情况下它将继续使用这些设置,除非您擦除它们。

如果你添加新的设置,这些将被拿起。 事实上,默认值被烘焙到Settings类中,所以即使app.config是空的,设置仍然有效。