在C#开发中,操作注册表是常见的系统级交互需求,无论是存储应用配置、记录软件激活状态,还是读取系统环境信息,都可以通过微软提供的注册表操作类实现。注册表是Windows系统用于存储系统和应用程序配置信息的数据库,C#通过Microsoft.Win32命名空间下的Registry和RegistryKey类完成相关操作。

C#注册表操作核心类说明
C#操作注册表主要依赖两个核心类,都在Microsoft.Win32命名空间下,使用前需要先添加对应的命名空间引用:
using Microsoft.Win32;
- Registry类:提供访问注册表根项的静态属性,比如
Registry.CurrentUser对应用户当前用户的注册表根项,Registry.LocalMachine对应本地机器的注册表根项,不需要实例化即可使用。 - RegistryKey类:表示注册表中的一个项,所有具体的读写、创建、删除操作都需要通过RegistryKey的实例方法完成。
常见注册表根项对应关系
Windows注册表的常用根项在C#中都有对应的静态属性,具体对应关系如下:
| 注册表根项路径 | C#中对应属性 | 说明 |
|---|---|---|
| HKEY_CURRENT_USER | Registry.CurrentUser | 存储当前登录用户的配置信息 |
| HKEY_LOCAL_MACHINE | Registry.LocalMachine | 存储本地计算机的全局配置信息 |
| HKEY_CLASSES_ROOT | Registry.ClassesRoot | 存储文件类型、COM组件等关联信息 |
| HKEY_USERS | Registry.Users | 存储所有用户配置文件的配置信息 |
| HKEY_CURRENT_CONFIG | Registry.CurrentConfig | 存储当前硬件配置信息 |
注册表项创建与键值写入
创建注册表项并写入键值需要以下步骤:先获取目标根项的RegistryKey实例,再调用CreateSubKey方法创建或打开子项,最后通过SetValue方法写入键值。以下是完整的写入示例:
using Microsoft.Win32;
using System;
class RegistryWriteDemo
{
static void Main()
{
try
{
// 获取当前用户的注册表根项
RegistryKey userRoot = Registry.CurrentUser;
// 创建或打开名为TestApp的子项,放在Software目录下
RegistryKey subKey = userRoot.CreateSubKey(@"SoftwareTestApp");
if (subKey != null)
{
// 写入字符串类型的键值
subKey.SetValue("AppName", "测试应用");
// 写入整数类型的键值
subKey.SetValue("Version", 1);
// 写入字节数组类型的键值
byte[] byteData = { 0x01, 0x02, 0x03 };
subKey.SetValue("ByteData", byteData);
Console.WriteLine("注册表键值写入成功");
subKey.Close();
}
}
catch (UnauthorizedAccessException ex)
{
Console.WriteLine("没有操作注册表的权限:" + ex.Message);
}
catch (Exception ex)
{
Console.WriteLine("写入注册表时发生错误:" + ex.Message);
}
}
}
需要注意,CreateSubKey方法如果目标子项不存在会自动创建,如果存在则直接打开,操作完成后要调用Close方法释放资源,避免内存泄漏。
注册表键值读取
读取注册表键值需要先打开对应的注册表项,再调用GetValue方法获取值,同时要处理项不存在或者键值不存在的情况。以下是读取示例:
using Microsoft.Win32;
using System;
class RegistryReadDemo
{
static void Main()
{
try
{
RegistryKey userRoot = Registry.CurrentUser;
// 打开指定的子项,第二个参数表示是否可写,读取时设为false即可
RegistryKey subKey = userRoot.OpenSubKey(@"SoftwareTestApp", false);
if (subKey != null)
{
// 读取字符串键值,第二个参数是默认值,键值不存在时返回该值
string appName = subKey.GetValue("AppName", "默认值").ToString();
// 读取整数键值
object versionObj = subKey.GetValue("Version");
int version = versionObj != null ? Convert.ToInt32(versionObj) : 0;
// 读取字节数组键值
byte[] byteData = subKey.GetValue("ByteData") as byte[];
Console.WriteLine($"应用名称:{appName},版本号:{version}");
if (byteData != null)
{
Console.WriteLine("字节数据长度:" + byteData.Length);
}
subKey.Close();
}
else
{
Console.WriteLine("未找到对应的注册表项");
}
}
catch (Exception ex)
{
Console.WriteLine("读取注册表时发生错误:" + ex.Message);
}
}
}
注册表项与键值删除
删除注册表键值使用RegistryKey的DeleteValue方法,删除整个注册表项使用DeleteSubKey或者DeleteSubKeyTree方法,后者会递归删除项下的所有子项和键值。以下是删除示例:
using Microsoft.Win32;
using System;
class RegistryDeleteDemo
{
static void Main()
{
try
{
RegistryKey userRoot = Registry.CurrentUser;
RegistryKey subKey = userRoot.OpenSubKey(@"SoftwareTestApp", true);
if (subKey != null)
{
// 删除指定键值,第二个参数表示键值不存在时是否抛出异常,设为false则不抛出
subKey.DeleteValue("ByteData", false);
Console.WriteLine("键值删除成功");
subKey.Close();
}
// 删除整个注册表项,DeleteSubKey不会递归删除子项,如果项有子项会抛出异常
// 如果要递归删除所有内容,使用DeleteSubKeyTree方法
Registry.CurrentUser.DeleteSubKeyTree(@"SoftwareTestApp", false);
Console.WriteLine("注册表项删除成功");
}
catch (UnauthorizedAccessException ex)
{
Console.WriteLine("没有删除注册表的权限:" + ex.Message);
}
catch (Exception ex)
{
Console.WriteLine("删除注册表时发生错误:" + ex.Message);
}
}
}
操作注意事项
- 操作注册表需要对应的权限,比如修改HKEY_LOCAL_MACHINE下的项需要管理员权限,普通用户只能自由操作HKEY_CURRENT_USER下的部分项。
- 注册表路径中的反斜杠需要转义,或者使用@符号前缀的字符串,避免被识别为转义字符。
- 操作完成后务必关闭RegistryKey实例,否则可能导致资源无法释放,甚至后续操作失败。
- 不要随意修改系统关键的注册表项,否则可能导致系统或者应用程序无法正常运行。
如果需要在Web应用或者非管理员权限的场景下操作注册表,建议优先选择用户可写的注册表路径,或者改用配置文件、数据库等方式存储数据,降低权限要求。
C#注册表操作RegistryKey注册表读写注册表删除修改时间:2026-06-09 05:24:30