直接用 RegistryKey
无法加载 .reg 文件
Reg 文件是文本格式的注册表导出数据,
RegistryKey类本身不提供解析功能。试图用
OpenSubKey或
CreateSubKey直接打开一个
.reg文件路径会抛出
IOException或找不到路径——因为 Windows 把它当普通文本文件,不是注册表句柄。
标准做法:调用 reg import
命令行
Windows 自带的
reg.exe支持导入:
reg import "path oile.reg"。C# 可通过
Process.Start调用它,这是最稳妥、兼容性最好的方式。 必须使用绝对路径,相对路径在子进程中容易失败 建议加
/c参数隐藏黑窗:
cmd /c reg import "C:\temp\config.reg"需检查返回码:
process.ExitCode == 0表示成功;非 0 通常意味着语法错误或权限不足 注意 UAC:如果目标键在
HKEY_LOCAL_MACHINE,程序需以管理员身份运行,否则静默失败
手动解析 .reg 文件要小心编码和转义
若因沙盒/策略限制不能执行外部命令,才考虑手写解析器。但要注意:
.reg文件默认是 UTF-16 LE(带 BOM),用
File.ReadAllText(path, Encoding.Unicode)读取,别用
UTF8否则中文值会乱码 键路径格式如
[HKEY_CURRENT_USER\Software\MyApp],注意双反斜杠是文本里的字面量,实际注册表路径应转为单反斜杠 字符串值形如
"ValueName"="Hello World",等号右侧可能含转义序列:
\→ ,
"→
",需逐个处理 数值类型如
dword:00000001或
hex(2):63,00,6f,00,64,00,65,00,00,00,解析逻辑复杂,容易漏掉字节序或截断
推荐封装成可复用的 ImportRegFile
方法
把命令行调用包装成方法,兼顾错误反馈和权限提示:
public static bool ImportRegFile(string regFilePath)
{
var startInfo = new ProcessStartInfo("cmd", $"/c reg import "{Path.GetFullPath(regFilePath)}"")
{
UseShellExecute = false,
RedirectStandardOutput = true,
RedirectStandardError = true,
CreateNoWindow = true
};
using var p = Process.Start(startInfo);
p.WaitForExit();
return p.ExitCode == 0;
}调用前先检查
File.Exists(regFilePath),并在 UI 层明确提示“需要管理员权限”——很多问题其实卡在这一步,而不是解析逻辑本身。
