应用程序设置概述
本文讨论如何代表应用程序和用户创建和存储设置数据。
借助 Windows 窗体的应用程序设置功能,可以轻松地在客户端计算机上创建、存储和维护自定义应用程序和用户首选项。 借助 Windows 窗体应用程序设置,不仅可以存储应用程序数据(如数据库连接字符串),还可以存储特定于用户的数据,例如用户应用程序首选项。 使用 Visual Studio 或自定义的托管代码,您可以创建新的设置,读取并将其写入磁盘,绑定到窗体的属性上,并在加载和保存之前验证设置数据。
应用程序设置使开发人员能够使用很少的自定义代码在应用程序中保存状态,并替代早期版本的 .NET Framework 中的动态属性。 应用程序设置包含对动态属性的许多改进,这些属性是只读的、后期绑定的,并且需要更多的自定义编程。 动态属性类已保留在 .NET Framework 2.0 中,但它们只是精简包装应用程序设置类的 shell 类。
什么是应用程序设置
Windows 窗体应用程序通常需要一些对运行至关重要的数据,但这些数据不适合直接包含在应用程序代码中。 如果应用程序使用 Web 服务或数据库服务器,可能需要将此信息存储在单独的文件中,以便将来无需重新编译即可对其进行更改。 同样,应用程序可能需要存储特定于当前用户的数据。 例如,大多数应用程序都具有自定义应用程序外观和行为的用户首选项。
应用程序设置通过提供在客户端计算机上存储应用程序范围的设置和用户范围的设置的简单方法来解决这两种需求。 使用 Visual Studio 或代码编辑器,通过指定给定属性的名称、数据类型和范围(应用程序或用户)来定义设置。 甚至可以将相关设置放入具名组,以便于更轻松地使用和提高可读性。 定义后,这些设置将持久保存并在运行时自动读回到内存中。 可插入体系结构允许更改持久性机制,但默认情况下使用本地文件系统。
应用程序设置的工作原理是将数据作为 XML 保存到不同的配置(.config)文件,对应于设置是应用程序范围还是用户范围。 在大多数情况下,应用范围的设置是只读的,因为它们是程序信息,因此通常不需要更改它们。 相比之下,即使应用程序在部分信任下运行,也可以在运行时安全地读取和写入用户范围的设置。 有关部分信任的详细信息,请参阅 Windows 窗体中的 安全性概述。
设置以 XML 片段的形式存储在配置文件中。 应用程序范围的设置由 <applicationSettings>
元素表示,通常放置在 应用.exe.config中,其中 应用 是主可执行文件的名称。 用户范围设置由 <userSettings>
元素表示,并放置在 user.config中。必须使用应用程序部署 应用.exe.config 文件;设置体系结构将在应用程序首次保存该用户的设置时按需创建 user.config 文件。 还可以在 应用.exe.config 中定义 <userSettings>
块,以提供用户范围设置的默认值。
自定义控件可以通过实现 IPersistComponentSettings 接口(该接口公开 SaveSettings 方法)来保存自己的设置。 Windows 窗体 ToolStrip 控件实现此接口,以在应用程序会话之间保存工具栏和工具栏项的位置。 有关自定义控件和应用程序设置的详细信息,请参阅 自定义控件的应用程序设置。
用户范围的设置存储在何处
默认提供程序 LocalFileSettingsProvider将用户范围设置存储在 LocalApplicationData 文件夹中。 如果该文件夹不可用,则使用 ApplicationData 文件夹。 创建特定于应用的子文件夹来存储用户范围的设置文件。 此文件夹的名称基于应用的主 程序集的三个属性:
- 程序集的 CompanyName。
- 基于两条信息的哈希值:
- 程序集的 FriendlyName。 如果
FriendlyName
不可用,则使用 ProductName。 - 如果程序集的 StrongName 可用,则使用该程序集,否则使用该程序集的绝对 文件夹路径。
- 程序集的 FriendlyName。 如果
- AssemblyName.Version 字符串。
如果上述任何程序集详细信息发生更改,以前针对用户的设置将会丢失,因为会生成新的子文件夹名称。 例如,如果释放了新版本的应用,并且 AssemblyName.Version
值与以前的版本不同,则用于存储用户范围的设置的子文件夹的名称将发生更改。 如果用户设置必须在应用版本之间保留,请创建自定义设置提供程序。 有关详细信息,请参阅 自定义设置提供程序。
应用程序设置的限制
不能在托管 .NET Framework 的非托管应用程序中使用应用程序设置。 设置在 Visual Studio 插件、用于 Microsoft Office 的 C++ 组件、Internet Explorer 中的控件托管或 Microsoft Outlook 插件和项目等环境中不起作用。
当前无法绑定到 Windows 窗体中的某些属性。 最引人注目的示例是 ClientSize 属性,因为绑定到此属性会导致运行时出现不可预知的行为。 通常可以通过以编程方式保存和加载这些设置来解决这些问题。
应用程序设置没有用于自动加密信息的内置设施。 不应以明文形式存储与安全相关的信息,例如数据库密码。 如果要存储此类敏感信息,应用程序开发人员负责确保其安全。 如果想要存储连接字符串,建议使用 Windows 集成安全性,而不是将密码硬编码到 URL 中。 有关详细信息,请参阅 代码访问安全和 ADO.NET。
应用程序设置入门
如果您使用 Visual Studio,可以在 属性 窗口中通过 (ApplicationSettings) 属性在 Windows 窗体设计器中定义设置。 以这种方式定义设置时,Visual Studio 会自动创建一个自定义托管包装器类,该类将每个设置与类属性相关联。 Visual Studio 还负责将设置绑定到窗体或控件上的属性,以便控件的设置在显示窗体时自动还原,并在窗体关闭时自动保存。
若要更详细地控制设置,可以定义自己的自定义应用程序设置包装器类。 这可以通过从 ApplicationSettingsBase派生类、添加对应于每个设置的属性以及向这些属性应用特殊属性来实现。 有关创建包装类的详细信息,请参阅 应用程序设置体系结构。
还可以使用 Binding 类以编程方式将设置绑定到窗体和控件上的属性。