2017-07-17 53 views
2

沒有錯誤,沒有例外,沒有任何東西。除了註冊表保持原樣以外,一切似乎都可以。C#:無法看到Windows註冊表中的更改

class Program 
    { 
     static void Main(string[] args) 
     { 
      try 
      { 
       Edit(); 
      } 
      catch (Exception) 
      { 
       Restore(); // not included in the sample for simplicity 
      } 
     } 

     public static void Edit() 
     { 
      Microsoft.Win32.RegistryKey Login; 
      Login = Microsoft.Win32.Registry.LocalMachine.CreateSubKey(ConfigurationManager.AppSettings["Login"].ToString()); 
      Login.SetValue("ServerName", ConfigurationManager.AppSettings["ServerName"].ToString()); 
      Login.SetValue("ImageServerName", ConfigurationManager.AppSettings["ImageServerName"].ToString()); 
      Login.Close(); 

      Microsoft.Win32.RegistryKey Login2; 
      Login2 = Microsoft.Win32.Registry.LocalMachine.CreateSubKey(ConfigurationManager.AppSettings["Wow6432NodeLogin"].ToString()); 
      Login2.SetValue("ServerName", ConfigurationManager.AppSettings["Wow6432NodeServerName"].ToString()); 
      Login2.SetValue("ImageServerName", ConfigurationManager.AppSettings["Wow6432NodeImageServerName"].ToString()); 
      Login2.Close(); 
     } 
} 

我覺得在某處存在錯誤。但不會拋出異常。 catch塊永遠不會被擊中。

我以管理員身份運行它。我甚至沒有管理權限運行它,但它應該顯示「訪問被拒絕」或其他東西時仍然沒有錯誤。我重新啓動筆記本電腦以查看所應用的更改,但仍然沒有成功。

我使用此代碼來讀取最近添加的值,我可以看到按鍵。但不知何故這些變化沒有被應用。

 Microsoft.Win32.RegistryKey key = Microsoft.Win32.Registry.LocalMachine.OpenSubKey(ConfigurationManager.AppSettings["Login"].ToString()); 
     Object o = key.GetValue("ServerName"); 
     Console.WriteLine(o.ToString()); 

我使用的.Net 4.5.2,構建所有CPU,SO:Windows 7的

我需要提交更改什麼?

+0

您可能會收到錯誤消息。你應該編輯你的代碼,以便你可以看到錯誤是什麼。 – SLaks

+0

這就是我的想法,但控制檯顯示沒有錯誤。 catch塊永遠不會被擊中。 –

+0

你怎麼知道?你的代碼讓你無法知道'catch'塊是否被擊中。 – SLaks

回答

2

正如@PieterWitvoet在評論中所建議的那樣,您可能希望改用OpenBaseKey()。這是爲了避免了WoW64註冊表重定向如下解釋:https://msdn.microsoft.com/en-us/library/windows/desktop/aa384182.aspx

注意的小字,在該頁面的末尾:

要檢查運行具有註冊表編輯器這個例子的作用,檢查值以下鍵。請注意,應用程序應避免在硬編碼註冊表路徑中使用Wow6432Node。

所以,這裏是你可能不是做什麼的例子:

static void Edit() 
{ 
    using (var root = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry64)) 
    using (RegistryKey key = root.CreateSubKey("SOFTWARE\\Homebrew-Testing")) 
    { 
     key.SetValue("ServerName", "ServerName-Value"); 
     key.SetValue("ImageServerName", "ImageServerName-Value"); 
    } 
} 

通知您如何拋棄你的代碼與Wow6432Node專門處理,該建議針對的第二部分上面鏈接的文章。

RegistryView的文檔指出,如果您在32位操作系統上請求64位視圖,則返回的鍵將位於32位視圖中。

我希望這會有所幫助。祝你好運。