构建了一个命令行程序,使用Registry类进行注册表读取,但key获取的值为空。
var keyPath = @"key";
var valueName = "value";
using (RegistryKey key = Registry.LocalMachine.OpenSubKey(keyPath))
{
if (key != null)
{
// 读取注册表项下的值
var vl= key.GetValue(valueName);
Console.WriteLine(vl);
}
}
Win32Native.RegOpenKeyEx返回的值为2,根据错误信息,对应的是ERROR_FILE_NOT_FOUND。
查看了一下注册表,键值是存在的,那估计就是读取位置的问题。更改下代码:
var keyPath = @"key";
var valueName = "value";
var lm = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry64);
using (RegistryKey key = lm.OpenSubKey(keyPath))
{
if (key != null)
{
var vl= key.GetValue(valueName);
Console.WriteLine(vl);
}
}
这样就可以读取了。
但为什么console程序,会读取32位注册表信息呢?
查看了下源码,Registry.LocalMachine使用的RegistryView位default,而没有进行指定Registry64/Registry32。推测是根据程序架构设定进行匹配。当前构建时候,使用的是Any CPU。如果更改为x64架构,使用第一段代码,也是能得到结果的。
但Any CPU为何会构建32位的程序呢?
查看项目的属性面板,在生成属性下,目标平台是Any CPU,并且默认勾选了首选32位。就是这个选项,影响了程序架构。
到此,算是结案了。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义