RegistryKey 无法直接加载 .reg 文件,应调用 reg import 命令行;需用绝对路径、检查 ExitCode、以管理员权限运行,并注意 UTF-16 LE 编码及转义处理。

直接用 RegistryKey 无法加载 .reg 文件
Reg 文件是文本格式的注册表导出数据,RegistryKey 类本身不提供解析功能。试图用 OpenSubKey 或 CreateSubKey 直接打开一个 .reg 文件路径会抛出 IOException 或找不到路径——因为 windows 把它当普通文本文件,不是注册表句柄。
标准做法:调用 reg import 命令行
windows 自带的 reg.exe 支持导入:reg import "pathtofile.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 层明确提示“需要管理员权限”——很多问题其实卡在这一步,而不是解析逻辑本身。