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(@”SoftwareMyApp”)?.GetValue(“InstallPath”, “”);
写入注册表值(CreateSubKey + SetValue)
写入分两步:确保子键存在(CreateSubKey 自动创建路径),再设值:
-
CreateSubKey("PathToKey", writable: true)返回可写 key;若仅读,用OpenSubKey("……", false) -
SetValue("Name", value, RegistryValueKind)显式指定类型更稳妥(如String、DWord、QWord、Binary) - 不指定类型时,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 更稳妥。