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