命令行程序读取注册表失败的分析

Posted on   云起  阅读(59)  评论(0编辑  收藏  举报

构建了一个命令行程序,使用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位。就是这个选项,影响了程序架构。

到此,算是结案了。

相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义

随笔 - 119, 文章 - 0, 评论 - 3, 阅读 - 4066

Copyright © 2025 云起
Powered by .NET 9.0 on Kubernetes

点击右上角即可分享
微信分享提示