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

Posted on 2024-07-17 18:22  云起  阅读(29)  评论(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位。就是这个选项,影响了程序架构。

到此,算是结案了。

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