2010-05-16 56 views
11

我正在使用64位Windows,並且我的應用程序以提升的特權運行。我有以下非常簡單的代碼問題:C#在64位操作系統上讀取錯誤的註冊表數據

myKey = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Microsoft\Windows\CurrentVersion\Run"); 
    if (myKey != null) 
    { 
    string[] HKLMvaluenames = myKey.GetValueNames(); 
    } 

但由於某些原因HKLMvaluenames陣列中填充值從以下注冊表項:

HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Run 

有沒有解決這個問題的方法嗎?

+1

由於外部/非託管依賴關係或其他原因,您的代碼是否必須以32位模式運行? – 2010-05-16 12:53:04

+0

您的應用程序是否編譯爲32位應用程序? Wow64是64位Windows操作系統的32位兼容層。 – Oded 2010-05-16 12:53:36

+0

@Nick:我不必在32位運行,但我希望我的應用程序能夠在32位操作系統上工作(這非常重要)。 @Oded:是的,我知道是什麼。我的應用程序使用VX2010 Express進行編譯,所以我想我甚至不能選擇它如何編譯。我可以在某處查看嗎? – baal80 2010-05-16 13:07:22

回答

17

這是由設計,32位程序具有不同於64位程序的註冊表視圖。當他們嘗試從HKLM \ Software配置單元讀取值時,它們被重定向到HKLM \ Software \ Wow6432Node項。如果使用Project + Properties,Build選項卡,Platform Target = Any CPU構建C#程序,那麼它將作爲64位程序運行,並且不會被重定向。

32位程序可以取消重定向,但使用.NET RegistryKey類不容易。 P /使用KEY_WOW64_64KEY選項調用RegOpenKeyEx是必需的。更多信息可在這Windows SDK article


編輯:這現在也可用於.NET與.NET 4特定的RegistryKey.OpenBaseKey()方法。通過RegistryView.Registry64以64位進程的方式查看註冊表。

5

雖然我也陷入了同樣的問題,或者對這個問題的原因相同的焦點,我發現了一個解決方案。

使用此:

//To set the Base to the right path set RegistryView to DEFAULT, Registry64 or Registry32 regarding the path you need. If you want to go over the x64 root: 

RegistryKey rk = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry64) 
     .OpenSubKey(@"SOFTWARE\Microsoft\Windows\CurrentVersion\Run"); 

現在,它會表現你想要的方式。

玩得開心!

相關問題