2010-02-04 160 views
13

我有一個是創建一些註冊表項一個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

回答

21

只是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

1

看看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

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位的,myAppKeyHKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\MyApp。如果是64位,則指向HKEY_LOCAL_MACHINE\SOFTWARE\MyApp

OpenBaseKey的優點是它消除了在代碼中引用Wow6432的需要。

相關問題