C#读取注册表:在针对x86的应用程序中,ProductID返回null。“Any CPU”正常工作。

11

我最近换了一台W7 64位机器,并安装了VS 2010。 我的项目被设置为在任意CPU上运行。但当我将其目标改为x86时,我注意到我的某些注册表调用不再起作用。

我正在尝试这样读取ProductID字段:

RegistryKey windowsNTKey = Registry.LocalMachine.OpenSubKey(@"Software\Microsoft\Windows NT\CurrentVersion");
object productID = windowsNTKey.GetValue("ProductId");

在 x86 模式下,productID 始终为 null,而在“任何 CPU”模式下运行时,它正常工作。这是怎么回事?


2
这个程序正在从注册表的不同区域读取。我不知道最好的处理方法是什么。 - Rup
@Rup - 我该怎么解决这个问题? - Chris
3个回答

9

一些注册表键由WOW64重定向。有关此主题的更多信息,请参阅MSDN http://msdn.microsoft.com/en-us/library/aa384232(v=vs.85).aspx

如果您确实希望始终访问x64节点(.Net4):

  RegistryKey localMachine = RegistryKey.OpenBaseKey(Microsoft.Win32.RegistryHive.LocalMachine, RegistryView.Registry64);
  RegistryKey windowsNTKey = localMachine.OpenSubKey(@"Software\Microsoft\Windows NT\CurrentVersion");
  object productID = windowsNTKey.GetValue("ProductId");

1
RegistryKey.OpenBaseKey 对我来说不存在... 我只有 RegistryKey.OpenRemoteBaseKey?我正在使用 Microsoft.Win32;,所以不明白为什么? - Chris
@Chris 我能看到这两种访问方式的唯一区别就是 OpenbaseKey 不是 ComVisible - Oskar Kjellin
使用 OpenRemoteBaseKey 时无法将 RegistryView 枚举作为参数传递,我需要引用特殊的程序集吗? - Chris
啊...我正在针对3.5版本,这些函数只在.NET 4中可用。 - Chris

9

这段代码将获取所有操作系统架构和程序架构的ID。虽然可以写得更短,但我喜欢可读性。

    static string GetProductId()
    {
        RegistryKey localMachine = null;
        if (Environment.Is64BitOperatingSystem)
        {
            localMachine = RegistryKey.OpenBaseKey(Microsoft.Win32.RegistryHive.LocalMachine, RegistryView.Registry64);
        }
        else
        {
            localMachine = RegistryKey.OpenBaseKey(Microsoft.Win32.RegistryHive.LocalMachine, RegistryView.Registry32);
        }
        RegistryKey windowsNTKey = localMachine.OpenSubKey(@"Software\Microsoft\Windows NT\CurrentVersion");
        return windowsNTKey.GetValue("ProductId").ToString();
    }

1
如果您在32位操作系统上请求64位视图,则返回的键将在32位视图中。 - Guillaume

3

在Win64上,一些32位应用程序的注册表键存储在Software\Wow6432Node子键中。

如果您想切换到64位键,可以将RegistryView枚举作为RegistryKey.OpenBaseKey的参数使用。

个人而言,为了使代码始终在主注册表键(非Wow6432)中工作,我使用以下结构:

RegistryKey.OpenBaseKey(RegistryHive.CurrentUser, Environment.Is64BitOperatingSystem ? RegistryView.Registry64 : RegistryView.Registry32)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接