2010-03-17 68 views
22

32位註冊表項在註冊表中的Wow6432node下時,OpenSubKey()和其他Microsoft.Win32註冊表函數在64位系統上返回null?爲什麼OpenSubKey()在我的Windows 7 64位系統上返回null?

我正在從.NET庫調用OpenSubKey()的單元測試框架。

我的開發系統是一個Windows   7 64位環境,安裝了Visual Studio 2008 SP1和Windows   7 SDK。

我們正在進行單元測試的應用程序是一個32位應用程序,因此根據HKLM\Software\Wow6432node虛擬化了註冊表。當我們致電:返回

Registry.LocalMachine.OpenSubKey(@"Software\MyCompany\MyApp\"); 

空,但明確說明在這裏尋找工作:

Registry.LocalMachine.OpenSubKey(@"Software\Wow6432node\MyCompany\MyApp\"); 

從我明白這個功能應該是不可知的32位或64位環境和宜知道跳轉到虛擬節點。

更奇怪的是,在我們的應用程序的編譯和安裝版本中完全相同的調用在相同的系統上運行得很好,並且正在獲取運行所需的註冊表項;其中也被放置在HKLM\Software\Wow6432node

我該怎麼辦?

+0

跟進:事實證明,我們並不需要創建新的平臺目標。我們通過nunit運行測試,它發佈一個x86特定的可執行文件。使用x86特定的可執行文件允許測試在不更改框架的情況下訪問註冊表。 – BrMcMullin

+0

我在這裏找到了答案[http://stackoverflow.com/questions/1074411/how-to-open-a-wow64-registry-key-from-a-64-bit-net-application](http://stackoverflow .com/questions/1074411/how-to-open-a-wow64-registry-key-from-a-64-bit-net-application) – Jirapong

回答

22

這聽起來像你的單元測試項目編譯爲64位。在單元測試項目的Compile設置中,將「目標CPU」設置爲x86(而不是AnyCPU)。

+3

啊哈!這確實是發生了什麼事。非常感謝你! – BrMcMullin

3

是的,我也有與Windows 7 64位和視覺  Studio   2008 SP1相同的問題。但是我的解決方案恰恰相反,就是從「x86」改爲「Any CPU」或「x64」。

+0

這確實也會起作用,但對於我的情況,我需要對我們的自動化環境提供32位支持 – BrMcMullin

7

如果你真的需要一個32位的應用程序,你可以訪問64位註冊表這樣的:

RegistryKey localMachine64 = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry64); 
RegistryKey regKey = localMachine64.OpenSubKey(@"Software\MyCompany\MyApp\", false); 
+0

OpenBaseKey()的.NET的最低要求版本是否可用?特別是,它可以使用Visual Studio 2008嗎? –

+0

.NET 4.0或更高版本? –

+0

它似乎是.NET 4.0。從[另一個答案](http://stackoverflow.com/questions/26217199/what-are-some-alternatives-to-registrykey-openbasekey-in-net-3-5/26217602#26217602):「對於.NET版本早於版本4,沒有框架API允許訪問備用註冊表視圖。「 –

0

向誰可能涉及

在我的測試,如果你正在使用AnyCpu建代碼來執行OpenSubKey,並在x64操作系統上運行它,你會發現你沒有在你期待的地方工作。

說,例如:(在.NET 4.5.2測試)

RegistryKey rsk = Registry.LocalMachine.OpenSubKey("SOFTWARE"); 

當您檢查rsk.GetSubKeyNames()

我在調試這個檢查 ,結果既不是HKLM也不是HKCU,至少我不知道它是什麼(非常像HKCU但不一樣)。

和最有名的問題,這可能會導致爲:

DeleteSubKeyTree將拋出參數異常。 如果您在刪除之前嘗試打開子項,這是可以的,但是在刪除時,它會說,嘿,它不在這裏...

所以要小心,現在我永遠不會再使用AnyCPU 。

相關問題