95

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

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

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

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

我的问题是:

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

笔记。我已经搜索过有关此主题的问题,但我更加困惑。例如,这里对这个问题的回答是相当矛盾的,并不能说明太多。

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

4

2 回答 2

57

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

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

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

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

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

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

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

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

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

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

于 2011-09-18T10:26:37.777 回答
32

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

于 2012-10-25T16:21:49.637 回答