我有一个Visual Studio安装程序正在创建一些注册表项:
HKEY_LOCAL_MACHINE\SOFTWARE\MyApp
但它正在创建的注册表项自动出现在Wow6432Node:
下HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\MyApp
在msi执行的C#代码中创建注册表项时,如何忽略Wow6432Node? p>
答案 0 :(得分:22)
仅供参考,.NET 4.0原生支持此功能。例如:
RegistryBase = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry64);
然后,您可以使用 RegistryBase 变量访问HKLM的64位视图中的任何内容。相反, Registry32 将允许64位应用程序访问注册表的32位视图。
答案 1 :(得分:1)
看看http://www.pinvoke.net/default.aspx/advapi32/regopenkeyex.html。您需要使用注册表重定向器并传入访问掩码的正确值。不幸的是,你需要pInvoke。
答案 2 :(得分:1)
由于关于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\MyApp
。
OpenBaseKey
的优势在于它无需在代码中引用Wow6432
。