我有一個是創建一些註冊表項一個Visual Studio安裝程序創建64位註冊表項(非WOW64):從32位應用程序
HKEY_LOCAL_MACHINE\SOFTWARE\MyApp
但創建註冊表項Wow6432Node下自動出現:
HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\MyApp
在我的C#代碼中創建註冊表項時,如何在msi執行的C#代碼中忽略Wow6432Node?
我有一個是創建一些註冊表項一個Visual Studio安裝程序創建64位註冊表項(非WOW64):從32位應用程序
HKEY_LOCAL_MACHINE\SOFTWARE\MyApp
但創建註冊表項Wow6432Node下自動出現:
HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\MyApp
在我的C#代碼中創建註冊表項時,如何在msi執行的C#代碼中忽略Wow6432Node?
只是FYI,.NET 4.0本身就支持這一點。例如:
RegistryBase = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry64);
然後,您可以使用RegistryBase變量HKLM的64位視圖訪問任何東西。相反,Registry32將讓64位應用程序訪問註冊表的32位視圖。
很棒的答案。簡單而重要。 – Simon 2010-09-14 23:48:34
看看http://www.pinvoke.net/default.aspx/advapi32/regopenkeyex.html。您需要使用註冊表重定向器並傳入訪問掩碼的適當值。不幸的是,你需要pInvoke。
哦太棒了。有人寫了一個很好的.NET API來包裝pinvoke調用並使其不那麼糟糕嗎? – 2010-02-04 03:40:29
我不會說這真的太可怕了。也許有點不方便。只需添加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位的,myAppKey
點HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\MyApp
。如果是64位,則指向HKEY_LOCAL_MACHINE\SOFTWARE\MyApp
。
OpenBaseKey
的優點是它消除了在代碼中引用Wow6432
的需要。
我想,因爲你的應用程序是32位的,所以Windows確保所做的修改來自於'Wow6432Node'。要將它從該節點中取出並將條目置於正常路徑下,應用程序應該是64位的。 – legends2k 2010-02-20 01:15:59