在 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) 显式指定类型更稳妥(如 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 更稳妥。
