2012-01-24 142 views
0

可能重複:
C# WOW6432 registry node messin things up怪異的行爲

這是代碼:

var b1 = Registry.LocalMachine.OpenSubKey("software", true); 
var b2 = Registry.LocalMachine.OpenSubKey("software", true).OpenSubKey("company"); 
var r1 = Registry.LocalMachine.OpenSubKey("software").OpenSubKey("company").GetValueNames(); 
string resultString = Registry.LocalMachine.OpenSubKey("Software", true).CreateSubKey("company").GetValue(name).ToString(); 

name = "ApplicationDirectory"調用它。在最後一行,前兩個變量指向正確的位置(基於它們的Name屬性)。問題是r1,它沒有列出HKEY_LOCAL_MACHINE\SOFTWARE\company的內容,而是HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\company。爲什麼是這樣?這是64位機器中的一些重定向嗎?

+0

簡答:[是](http://msdn.microsoft.com/en-us/library/aa384232(v = vs.85).aspx)。 – Blorgbeard

+0

64位計算機有一個註冊表分隔爲32位。我認爲它被稱爲註冊表虛擬化。 –

+0

http://stackoverflow.com/questions/8959983/c-sharp-wow6432-registry-node-messin-things-up/8960020#8960020 –

回答

2

是的,在64位機器上有32位應用程序的重定向。查看你的問題的評論,也this SO answer

如果面向.NET 4或以上,你就可以訪問兩個Wow6432Node(用於32位應用程序)和「標準」節點(用於64位應用的一個)作爲RegistryKey.OpenBaseKey方法提供了一種參數類型RegistryView,允許選擇正確的節點使用。

如果您使用.Net 3.5或以前的版本,那麼如果您希望能夠讀取64位機器上的32/64位註冊表項,則必須使用P/Invoke。您必須使用RegOpenKeyEx並指定KEY_WOW64_32KEY作爲所需訪問的標誌。但這是另一個故事,超出了你的問題的範圍。