从32位应用程序创建64位注册表项(非WOW64)

14

我有一个Visual Studio安装程序,它正在创建一些注册表键:

HKEY_LOCAL_MACHINE\SOFTWARE\MyApp

但是它创建的注册表键自动出现在Wow6432Node下:

HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\MyApp

在我的C#代码中创建注册表键时,如何忽略Wow6432Node?该代码是由msi执行的。


我猜,由于你的应用程序是32位的,Windows会确保更改出现在Wow6432Node下。要将其从该节点中取出并将条目放置在正常路径下,你的应用程序应该是64位的。 - legends2k
3个回答

23

仅供参考,.NET 4.0本地支持此功能。例子:

RegistryBase = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry64);

你可以使用该 RegistryBase 变量来访问 HKLM 64 位视图中的任何内容。相反,Registry32 可以让64位应用程序访问注册表的32位视图。


2

由于关于OpenBaseKey的文档非常少,因此我将扩展shifuimam的答案并为OP提供解决方案:

Private Sub Foo()
    Dim myAppIs64Bit = Environment.Is64BitProcess
    Dim baseKey As RegistryKey
    If (myAppIs64Bit) Then
        baseKey = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry64)
    Else
        baseKey = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry32)
    End If
    Dim myAppKey As RegistryKey = baseKey.OpenSubKey("SOFTWARE\MyApp")
End Sub

如果应用程序是32位的,则myAppKey指向HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\MyApp。如果是64位,则指向HKEY_LOCAL_MACHINE\SOFTWARE\MyAppOpenBaseKey的优点是它消除了在代码中引用Wow6432的需要。

1

哦,太棒了。有没有人写过不错的.NET API来封装PInvoke调用,使其变得不那么可怕? - James Newton-King
我不会说它真的很糟糕。可能有点不方便。只需添加DllImports并定义KEY_WOW64_64KEY即可。更简洁的示例(用于删除)可以在http://geekswithblogs.net/derekf/archive/2007/06/26/113485.aspx上找到。 - nithins

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