我有一个Visual Studio安装程序,它正在创建一些注册表键:
HKEY_LOCAL_MACHINE\SOFTWARE\MyApp
但是它创建的注册表键自动出现在Wow6432Node下:
HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\MyApp
在我的C#代码中创建注册表键时,如何忽略Wow6432Node?该代码是由msi执行的。
我有一个Visual Studio安装程序,它正在创建一些注册表键:
HKEY_LOCAL_MACHINE\SOFTWARE\MyApp
但是它创建的注册表键自动出现在Wow6432Node下:
HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\MyApp
在我的C#代码中创建注册表键时,如何忽略Wow6432Node?该代码是由msi执行的。
仅供参考,.NET 4.0本地支持此功能。例子:
RegistryBase = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry64);
你可以使用该 RegistryBase 变量来访问 HKLM 64 位视图中的任何内容。相反,Registry32 可以让64位应用程序访问注册表的32位视图。
由于关于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
myAppKey
指向HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\MyApp
。如果是64位,则指向HKEY_LOCAL_MACHINE\SOFTWARE\MyApp
。
OpenBaseKey
的优点是它消除了在代码中引用Wow6432
的需要。看一下 http://www.pinvoke.net/default.aspx/advapi32/regopenkeyex.html。你需要使用注册表重定向,并传递适当的访问掩码值。不幸的是,你需要使用pInvoke。
Wow6432Node
下。要将其从该节点中取出并将条目放置在正常路径下,你的应用程序应该是64位的。 - legends2k