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

Ces*_*Gon 86 .net app-config settings.settings

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

我很惊讶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.configover 的最常见方案是什么Settings.settings,反之亦然?
  • 如果我的应用程序正在使用Settings.settings并且在app.config部署后更改了值,会发生什么?Settings.settings由于已经编译和分发,因此不会发生同步.

注意.我已经搜索了关于这个主题的问题,但我更加困惑.例如,这里这个问题的答案是相当矛盾的,并没有说清楚.

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

The*_*ing 52

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

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

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

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

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

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

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

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

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

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

  • 是的,可以使用配置管理器来更新web.config,但是您必须更改部署的文件,该文件通常对于UAC而言是锁定的。它不是为运行时更改而设计的,而设置是针对运行时间的更改而设计的。设置更改将保存到“用户配置文件”文件夹中,因此没有权限问题。您将连接字符串存储在app.config中,因为它是静态设置。如果您具有设置的自定义版本,则该设置会存储在其他位置,因此部署新更新不会有任何影响。自定义值将继续被覆盖,因此再次说明了为什么app.config更适合conn字符串。 (2认同)
  • 不错的拒绝投票。设置被部署到用户配置文件文件夹,请参阅[此处](http://stackoverflow.com/questions/469742/where-are-user-mode-net-settings-stored),这在UAC中是允许的。应用程序app.config甚至应用程序范围的设置都被视为只读,因为不允许用户在UAC下写入应用程序目录(例如程序文件)。因此,为什么app.config不是为运行时更改而设计的,而是为设置而设计的。我并不是说无法写入app.config,这只是一个不好的实践,除非您提升应用程序,否则它在现实世界中将不起作用。 (2认同)
  • 答案无误。您问为什么有两种机制,我现在对此进行了多次解释。在UAC上阅读。我会为您指出一些文档,但是它很稀缺。如果您仍然不接受我的答案,请创建您自己的答案并将其标记为正确。 (2认同)

Sim*_*ier 28

从.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的东西.

  • Simon,问题是关于`Settings.settings`文件和Visual Studio的`Settings`类.我在你的回答中没有看到这两个是如何处理的.相反,你提到`user.config`.这两个"设置"概念是否与`user.config`相关?或者他们来自较旧或较新的替代机制? (3认同)
  • 这个答案令我感到非常不满意,因为它甚至没有提到`Settings.settings`。 (2认同)