2017-01-09 96 views
1

我看到了幾篇關於如何在這裏讀取註冊表鍵值的帖子,我想我做得很好,但我在我的案例中讀到的密鑰總是空的,出於某種原因。C#讀取註冊表項/值,密鑰總是NULL

在HKLM \ SOFTWARE,我創建關鍵MyCompany的,然後是關鍵中,我創建了像另一個關鍵MyApp的: HKLM \ SOFTWARE \ MyCompany的\ MyApp的

在這個關鍵,我添加了一個字符串字符串值「MySetting 「

我試圖讀取使用以下代碼值:

using (RegistryKey key = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\MyCompany\MyApp", false)) 
{ 
    string spaUrl = (String)key.GetValue("MySetting"); 
} 

但關鍵是始終爲空,即使我有這些鍵和值定在上述位置。任何想法我做錯了什麼?

我得到System.NullReferenceException是未處理的異常,因爲鍵始終爲空。

SOLUTION

感謝盧克梅里特回答以下,我修改我的按鍵的位置是在HKLM \ SOFTWARE \ WOW6432Node和工作。謝謝盧克

+0

您是否有權讀取註冊表項? –

+0

我不知道。我如何弄清楚並獲得許可? – cd491415

+0

確定這是否是問題的簡單方法是以管理員身份運行您的應用程序。如果以這種方式成功運行,那麼很可能問題就在於權限。在這種情況下,您需要確保應用程序正在運行,因爲有權讀取特定的註冊表項 –

回答

2

正如史蒂夫指出的,它可能是一個x86與x64的問題。我在本地複製了代碼,並且在x86下運行時,我的密鑰始終爲空。將其更改爲x64允許我訪問密鑰。

您可以更改目標在項目屬性 - >在這裏建:

enter image description here

There's some more detail on this here if you explicitly need an x86 key。或者,您可以運行%systemroot%\syswow64\regedit來添加和編輯x86密鑰。

僅供參考;這適用於Admin和作爲標準用戶運行

+0

我的情況下的平臺目標是AnyCPU – cd491415

+0

感謝盧克。我將註冊表項移到了HKLM \ SOFTWARE \ WOW6432Node \ MyCompany \ MyApp下,並且工作正常。我想你的回答讓我找到解決方案。謝謝〜 – cd491415

1

我覺得這篇文章最能解答您的問題。 Reading 64bit Registry from a 32bit application

我有一個問題,我不得不在32位下運行應用程序,而不是任何CPU。因此,我一直收到NULL,因爲它找不到路徑。 我創建了一個IF/THEN包裝來允許它確定使用哪個密鑰。

RegistryKey localMachine; 
if (Directory.Exists("C:\\Windows\\SysWOW64")) 
    { localMachine = RegistryKey.OpenBaseKey(Microsoft.Win32.RegistryHive.LocalMachine, RegistryView.Registry64); } 
else { localMachine = Registry.LocalMachine; } 

string productsRoot = @"SOFTWARE\Microsoft\Windows\CurrentVersion\Installer\UserData\S-1-5-18\Products"; 
RegistryKey products = localMachine.OpenSubKey(productsRoot); 
string[] productFolders = products.GetSubKeyNames(); 

這解決了我的問題,並允許靈活性。如果我只是在「任何CPU」下運行它,這不是一個問題。但是對於這個程序,我必須指定我在哪個CPU下運行,因爲它的一個組件只需要在32位模式下運行。