2013-05-07 85 views
1

我想從註冊表中檢索值。例如像:HKEY_LOCAL_MACHINE\SOFTWARE\Manufacturer's name\Application name\InstallInfo如何從註冊表中檢索值?

根據「InstallInfo」有這麼多的變量,如 的ProductVersion,WebsiteDescription,WebSiteDirectory,客戶名稱,WebSitePort等

我想找回這些變量的一些值。我試着下面的代碼,但它返回

 var regKey = Registry.LocalMachine; 

     regKey = regKey.OpenSubKey(@"SOFTWARE\ABC Limited\ABC Application\InstallInfo"); 

     if (regKey == null) 
     { 
      Console.WriteLine("Registry value not found !"); 
     } 
     else 
     { 
      string dirInfo = (string)regKey.GetValue("WebSiteDirectory"); 
      Console.Write("WebSiteDirectory: " + dirInfo); 
     } 


     Console.ReadKey(); 
+0

你檢查它在哪裏拋出此異常? – Yahya 2013-05-07 11:37:02

+0

你有沒有檢查密鑰是否爲空,因爲我有同樣的問題一次! – Obama 2013-05-07 11:39:08

+0

是的,它在dirInfo =(string)中引發異常regKey.GetValue(「WebSiteDirectory」);線。 dirInfo返回null,所以NullReference異常發生。 – Anudeep 2013-05-07 11:41:32

回答

0

這可能是因爲你正在尋找下錯誤的根密鑰「不設置到對象的實例對象引用」。

它應該是:

Registry.CurrentUser 

,而不是

Registry.LocalMachine 

在這裏你去:

Registry.LocalMachine.CreateSubKey(@"SOFTWARE\Manufacturer's name\Application name\InstallInfo"); 
+0

在註冊表中。LocalMachine我也面臨同樣的問題 – Anudeep 2013-05-07 11:44:00

5

OpenSubKeyreturns null when it fails。這很清楚這裏發生了什麼。

由於您正在查看錯誤的根鍵,因此失敗。您正在關注HKCU,但關鍵在於HKLM。

所以你需要

RegistryKey regKey = Registry.LocalMachine.OpenSubKey(
    @"SOFTWARE\Manufacturer's name\Application name\InstallInfo"); 

,必須始終檢查返回值,當你調用OpenSubKey。如果是null則處理該錯誤情況。

if (regKey == null) 
    // handle error, raise exception etc. 

另外要注意的是registry redirector。如果您的進程是在64位系統上運行的32位進程,那麼您將看到註冊表的32位視圖。這意味着您嘗試查看HKLM\Softare會被透明地重定向到HKLM\Software\Wow6432Node

+0

在Registry.LocalMachine我也面臨同樣的問題 – Anudeep 2013-05-07 11:44:38

+1

閱讀我的答案的底部。這很簡單。當子鍵不存在時,'OpenSubKey'返回'null'。這就是發生的事情。原始代碼中的明顯錯誤是您正在查找錯誤的根密鑰。更微妙的錯誤是註冊表重定向器可能會讓你感到困惑。 – 2013-05-07 11:44:59

+0

我用空處理更新我的代碼。但我直到現在都找不到解決方案。我的機器是64位,我運行的應用程序設置太x64版本。爲什麼RegistryKey將用於WoW6432Node? – Anudeep 2013-05-07 12:44:45

1

你轉換regKey.GetValue("WebSiteDirectory")字符串之前,您應該檢查它是否爲空或不是,

if (regKey.GetValue("WebSiteDirectory")!=null) 
//do the rest