C#:无法看到Windows注册表中的更改

问题描述:

没有错误,没有例外,没有任何东西。除了注册表保持原样以外,一切似乎都可以。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

正如@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位视图中。

我希望这会有所帮助。祝你好运。