C#怎么操作注册表 C# Registry类读写注册表方法

C#通过Microsoft.Win32.Registry类操作注册表,支持五大根键读写;推荐优先使用CurrentUser(无需管理员权限),LocalMachine写入需管理员权限;读取用GetValue/GetXXX方法,写入用CreateSubKey+SetValue,删除用DeleteValue/DeleteSubKeyTree,注意权限、空值判断与资源释放。

在 C# 中操作 Windows 注册表,主要通过 Microsoft.Win32.Registry 类及其子类(如 RegistryKey)完成。它提供了对注册表五大根键(HKEY_CLASSES_ROOT、HKEY_CURRENT_USER、HKEY_LOCAL_MACHINE 等)的安全读写能力,无需 P/Invoke。

常用注册表根键访问方式

注册表根键是静态属性,直接调用即可获取顶层 RegistryKey 实例:

  • Registry.ClassesRoot —— 对应 HKEY_CLASSES_ROOT,常用于文件关联、COM 注册
  • Registry.CurrentUser —— 对应 HKEY_CURRENT_USER,当前用户配置,**推荐优先使用,无需管理员权限**
  • Registry.LocalMachine —— 对应 HKEY_LOCAL_MACHINE,本机全局设置,**写入需管理员权限**
  • Registry.Users —— 对应 HKEY_USERS,所有用户配置(含 .DEFAULT 和 SID 键)
  • Registry.CurrentConfig —— 对应 HKEY_CURRENT_CONFIG,硬件配置快照

读取注册表值(GetXXX 方法)

先用 OpenSubKey() 打开子键(可指定只读或读写),再用 GetValue() 或类型化方法读值:

  • key.GetValue("ValueName") 返回 object,需自行转换类型
  • key.GetValueKind("ValueName") 获取值类型(如 RegistryValueKind.String
  • 安全读取建议用 GetValue("Name", defaultValue) 避免 null 异常
  • 示例:string path = (string)CurrentUser.OpenSubKey(@"Software\MyApp")?.GetValue("InstallPath", "");

写入注册表值(CreateSubKey + SetValue)

写入分两步:确保子键存在(CreateSubKey 自动创建路径),再设值:

  • CreateSubKey("Path\To\Key", writable: true) 返回可写 key;若仅读,用 OpenSubKey("...", false)
  • SetValue("Name", value, RegistryValueKind) 显式指定类型更稳妥(如 StringDWordQWordBinary
  • 不指定类型时,C# 会自动映射:int → DWord,string → String,byte[] → Binary
  • 注意:向 HKEY_LOCAL_MACHINE 写入前,必须以管理员身份运行程序,否则抛出 UnauthorizedAccessException

删除键和值(DeleteSubKey / DeleteValue)

删除需谨慎,建议先判断存在性:

  • key.DeleteValue("ValueName", throwOnMissing: false) —— 删除单个值,不抛异常
  • key.DeleteSubKey("SubKeyName", throwOnMissing: false) —— 删除空子键
  • key.DeleteSubKeyTree("SubKeyPath") —— 递归删除整个子树(含所有子键和值)
  • 删除后记得调用 key.Close() 或用 using 语句释放资源

基本上就这些。核心就是:选对根键、打开/创建子键、读写值、及时关闭。权限和路径有效性是常见坑点,开发时多加 null 判断和 try-catch 更稳妥。