答案:在C#中通过Registry和RegistryKey类操作注册表,Registry提供根键访问入口,RegistryKey用于打开、创建、读写子项;使用OpenSubKey或CreateSubKey获取RegistryKey实例,推荐前者避免误创建;通过GetString、GetInt32等方法安全读取值,SetValue配合RegistryValueKind确保类型正确;注意权限问题,写HKLM需管理员权限,建议使用using语句管理资源释放,防止句柄泄漏。
在 C# 中操作 Windows 注册表,主要通过 Registry 和 RegistryKey 两个类完成。前者是静态类,提供对根键(如 HKEY_LOCAL_MACHINE)的访问入口;后者代表一个具体的注册表项,支持读、写、创建、删除等操作。
Registry 类封装了所有预定义的根键,比如 Registry.LocalMachine、Registry.CurrentUser。注意:它们本身不是 RegistryKey 实例,而是用来获取初始 RegistryKey 的“起点”。
OpenSubKey("路径", 可写) 打开已有项,第二个参数为 true 表示以可写方式打开(需权限)Cre
ateSubKey("路径") 创建或打开子项(不存在则新建,存在则直接返回)OpenSubKey,避免意外创建新项RegistryKey 提供了类型化的方法读写值,例如 GetValue("Name") 返回 object,而 GetInt32("Name")、GetString("Name") 等会自动转换并抛出异常(如果类型不匹配或值不存在)。
SetValue("Name", value, RegistryValueKind),显式指定值类型更安全(如 String、DWord、QWord、Binary)RegistryValueKind 时,系统按 value 类型自动推断,但可能不符合预期(比如 int 被存成 QWord 而非 DWord)GetValueNames() 或 GetValue("Name") != null 判断是否存在注册表操作极易因权限不足失败,尤其写入 HKEY_LOCAL_MACHINE 或系统级路径时。普通用户默认无权修改大多数 HKLM 下的项。
UnauthorizedAccessException 和 SecurityException 是必须的RegistryKey 实现了 IDisposable,虽然 .NET 会自动回收,但显式调用 Close() 或用 using 语句更稳妥,尤其在频繁操作或长期运行服务中。
using (var key = Registry.CurrentUser.OpenSubKey(@"Software\MyApp")) { ... }
基本上就这些。注册表操作不复杂但容易忽略权限和类型细节,用对方法、加好异常处理、选对根键,就能稳定工作。