作为开发人员,在注册表中存储配置/选项的工具是我生活的祸根。我无法轻松跟踪对这些选项的更改,无法轻松地将它们从一台机器移植到另一台机器,这一切都让我非常渴望 .INI 文件的美好时光......
在编写我自己的应用程序时,我应该选择将什么(如果有的话)放入注册表而不是老式的配置文件,为什么?
从用户的角度和程序员的角度来看,我不得不说将某些内容放入注册表中确实没有一个好的借口,除非它是文件关联或机器特定设置之类的东西。
我来自一个思想流派,它说一个程序应该可以从安装它的任何地方运行,安装应该在一台机器内完全移动,甚至可以移动到另一台机器而不影响它的运行。
任何可配置的选项或所需的 dll 等,如果它们不共享,则应位于安装目录的子目录中,以便轻松移动整个安装。
我使用了很多较小的实用程序,例如程序,所以如果它不能安装在 USB 记忆棒上并插入另一台机器并运行,那么它不适合我。
什么时候- 由于遗留集成或者因为您的客户的系统管理员说“应该这样”或者因为您正在使用更旧的语言进行开发,这使得使用 XML 变得更加困难,您被迫这样做。
为什么- 主要是因为注册表不像复制位于应用程序旁边的配置文件那样可移植(并且调用几乎相同)。
如果您使用的是 .Net2+,则您有 App.Config 和 User.Config 文件,并且您不需要在注册表中注册 DLL,因此请远离它。
配置文件有其自身的问题(见下文),但可以围绕这些问题进行编码,并且您可以更改您的架构。
微软政策:
注册表依赖于机器。我从来不喜欢它,因为它变慢了,几乎不可能找到你需要的东西。这就是为什么我喜欢简单的 ini 或其他设置文件。您知道它们在哪里(应用程序文件夹或用户文件夹),因此它们易于携带且易于阅读。
如果您在 Windows 注册表中存储一些窗口位置和最近使用的项目列表,世界会结束吗?到目前为止,它对我来说还不错。
HKEY-CURRENT-USER 是存储少量用户数据的好地方。这就是它的用途。仅仅因为其他人滥用了它而不将其用于预期目的似乎很愚蠢。
注册表读取和写入是线程安全的,但文件不是。所以这取决于你的程序是否是单线程的。
您希望在用户的漫游配置文件中可用的设置可能应该放在注册表中,除非您真的想要手动查找用户的应用程序数据文件夹。:-)
如果您正在开发一个新应用程序并且您关心可移植性,那么您不应该将数据存储在 Windows 注册表中,因为其他操作系统没有(Windows)注册表(duh note - 这可能很明显,但经常被忽视)。
如果你只是为 Win 平台开发......尽量避免它。配置文件(可能加密)是一种更好的解决方案。将数据存储到注册表中没有任何好处 - (例如,如果您使用的是 .NET,隔离存储是一个更好的解决方案)。
有点跑题了,但是因为我看到人们关心可移植性,所以我用过的最好的方法是 Qt 的 QSettings 类。它抽象了设置的存储(Windows 上的注册表、Mac OS 上的 XML 首选项文件和 Unix 上的 Ini 文件)。作为该课程的客户,我不必花费脑力思考注册表或其他任何事情,它就可以正常工作(tm)。
通常,如果您不将设置放入注册表,则主要使用它来获取当前的 Windows 设置、更改文件关联等。
现在,如果您需要检测您的软件是否已安装,您可以在注册表中进行最少的条目,这是您可以在任何配置中找到的位置。或在应用程序数据中搜索给定名称的文件夹。
如果我查看我的 Document and Settings 文件夹,我会看到很多使用 Unix 点符号来设置文件夹的软件: .p4qt .sqlworkbench .squirrel-sql .SunDownloadManager .xngr .antexplorer .assistant .CodeBlocks .dbvis .gimp-2.4 .jdictionary .jindent .jogl_ext (等)
在应用程序数据中,具有编辑器名称或软件名称的各种文件夹。看起来像是当前的趋势,至少在便携式应用程序中...
WinMerge 使用稍微不同的方法,将数据存储在注册表中,但在配置对话框中提供导入和导出选项。
我相信 Windows 注册表是一个好主意,但是由于应用程序开发人员的大量滥用以及 Microsoft 不鼓励/强制执行的标准策略,它变成了一个无法管理的野兽。由于您提到的原因,我讨厌使用它,但是在某些情况下使用它是有意义的:
我个人使用注册表来存储安装路径以供(卸载)安装脚本使用。我不确定这是否是唯一可能的选择,但似乎是一个明智的解决方案。当然,这是针对仅在 Windows 上使用的应用程序。
在 .NET 中确实不需要。
下面是 2 个示例,展示了如何使用 Project 属性来执行此操作。
这些示例通过 Windows 用户项目属性执行此操作,但应用程序也可以/可以执行相同操作。
更多在这里:
(讨论晚了,但是)简短的回答:组策略。
如果您客户的 IT 部门想要强制执行与 Windows 或您正在编写或捆绑的组件相关的设置,例如链接速度、自定义错误消息或要连接的数据库服务器,这通常仍然是通过组策略完成,这使其最终表现为存储在注册表中的设置。从 Windows 启动或用户登录时开始执行此类策略。
有一些工具可以创建自定义 ADMX 模板,这些模板可以将您的组件设置映射到注册表位置,并为管理员提供一个通用界面来执行他需要执行的策略,同时仅向他们显示那些对以这种方式执行有意义的设置。