从32位应用程序

问题描述:

我有一个是创建一些注册表项一个Visual Studio安装程序创建64位注册表项(非WOW64):从32位应用程序

HKEY_LOCAL_MACHINE\SOFTWARE\MyApp 

但创建注册表项Wow6432Node下自动出现:

HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\MyApp 

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

+0

我想,因为你的应用程序是32位的,所以Windows确保所做的修改来自于'Wow6432Node'。要将它从该节点中取出并将条目置于正常路径下,应用程序应该是64位的。 – legends2k 2010-02-20 01:15:59

只是FYI,.NET 4.0本身就支持这一点。例如:

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

然后,您可以使用RegistryBase变量HKLM的64位视图访问任何东西。相反,Registry32将让64位应用程序访问注册表的32位视图。

+1

很棒的答案。简单而重要。 – Simon 2010-09-14 23:48:34

看看http://www.pinvoke.net/default.aspx/advapi32/regopenkeyex.html。您需要使用注册表重定向器并传入访问掩码的适当值。不幸的是,你需要pInvoke。

+0

哦太棒了。有人写了一个很好的.NET API来包装pinvoke调用并使其不那么糟糕吗? – 2010-02-04 03:40:29

+0

我不会说这真的太可怕了。也许有点不方便。只需添加DllImports并定义KEY_WOW64_64KEY。可以在http://geekswithblogs.net/derekf/archive/2007/06/26/113485.aspx上找到更简洁的示例(用于删除)。 – nithins 2010-02-04 03:53:14

因为很少有文档中关于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位的,myAppKeyHKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\MyApp。如果是64位,则指向HKEY_LOCAL_MACHINE\SOFTWARE\MyApp

OpenBaseKey的优点是它消除了在代码中引用Wow6432的需要。