2013-04-17 64 views
1

我正在獲取和設置Windows窗體中的註冊表值。獲取註冊表值導致程序無一例外地

我的代碼如下所示:

Microsoft.Win32.RegistryKey key = Microsoft.Win32.Registry.CurrentUser.CreateSubKey("SmogUser"); 
if (((Guid)key.GetValue("DeviceId", Guid.Empty)) == Guid.Empty) 
{ 
    Guid deviceId = Guid.NewGuid(); 
    key.SetValue("DeviceId", deviceId); 
    key.Close(); 
} 
else 
{ 
    Guid deviceId = (Guid)key.GetValue("DeviceId"); 
} 

當我運行該程序的第一次,它進入if語句,並設置deviceId, 但是當我跑第二次,程序不能繼續並沒有例外。

問題是什麼?

+0

哪個版本的Visual Studio?第二次是否進入其他條件? – Arun

+0

Visul Studio Ultimate 2012 - 編號如果條件第二次運行,程序會在進入前暫停。 –

回答

2

我不明白爲什麼好方法RegistryKey.GetValue()行爲是錯的,但我使用此代碼能解決問題:

 Microsoft.Win32.RegistryKey key = Microsoft.Win32.Registry.CurrentUser.CreateSubKey("SmogUser"); 
     if (key != null) 
     { 
      var value = key.GetValue("DeviceId", null) ?? Guid.Empty; 

      if (Guid.Empty.Equals(value)) 
      { 
       Guid deviceId = Guid.NewGuid(); 
       key.SetValue("DeviceId", deviceId); 
       key.Close(); 
      } 
      else 
      { 
       var deviceId = (Guid)key.GetValue("DeviceId"); 
      } 
     } 

看來,如果你通過null爲默認值的方法沒有按」 t崩潰。然後,您可以檢查空值並將Guid變量值設置爲Guid.Empty

+0

是啊!偉大的答案:) –

1

您在key.GetValue("DeviceId", Guid.Empty)傳遞第二個參數的默認值Guid.Empty,然後把它比作Guid.Empty

第一次沒有密鑰時,返回Guid.Empty,然後輸入if塊。然後返回另一個值(DeviceId),並輸入else

考慮有關參數的信息msdn RegistryKey.GetValue。簽名是

public Object GetValue(
    string name, 
    Object defaultValue) 

RegistryKey.CreateSubKey「創建一個新的子項或打開一個現有的子項。」

當註冊表中沒有密鑰時,您可以看到第二個參數。請注意,執行您的程序之間的註冊表持續存在


此處的問題是您正在閱讀註冊表兩次。

RegistryKey key = Registry.CurrentUser.CreateSubKey("SmogUser"); 
Guid regValue = Guid.Parse(key.GetValue("DeviceId", Guid.Empty).ToString()); 
if (value == Guid.Empty) 
{ 
    regValue = Guid.NewGuid(); 
    key.SetValue("DeviceId", regValue); 
    key.Close(); 
} 
//here you have Guid in regValue, which is exactly the same 
//as in registry. No need to call GetValue again 
+0

我不明白,而key.GetValue(「blabla」,默認)是第一次工作,爲什麼key.GetValue(「blabla」,默認)不工作? –

+0

@MehmetInce因爲你已經寫了一些價值。 Windows註冊表在程序執行過程中保持不變,它仍然存在 –

+0

但是我退出了程序並且第二次運行它。 –

1

您正在嘗試將對象轉換爲導致錯誤原因的Guid。這個作品 -

Microsoft.Win32.RegistryKey key = Microsoft.Win32.Registry.CurrentUser.CreateSubKey("SmogUser"); 
if ((new Guid(key.GetValue("DeviceId", Guid.Empty).ToString()) == Guid.Empty)) 
{ 
    Guid deviceId = Guid.NewGuid(); 
    key.SetValue("DeviceId", deviceId); 
    key.Close(); 
} 
else 
{ 
    Guid deviceId = new Guid(key.GetValue("DeviceId").ToString()); 
} 

基本上我轉換爲字符串,然後從字符串中創建一個新的Guid對象。由於Guid字符串值正在被返回,所以直接從對象投射到Guid不再有效。

至於在沒有拋出異常的問題,出現這種情況與Visual Studio 64位,見其他職位上的同一主題 -

Visual Studio 2010 debugger is no longer stopping at errors VS2010 does not show unhandled exception message in a WinForms Application on a 64-bit version of Windows

最好的解決辦法是有一個嘗試在您的代碼周圍抓取

+0

而另一個偉大的答案,謝謝@阿倫:) –