2012-08-04 116 views
26

我想插入使用C#中Microsoft.Win32.RegistryKey一些简单的注册表项,但路径自动改变自:避免注册Wow6432Node重定向

HKEY_LOCAL_MACHINE\SOFTWARE\Test 

HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Test 

我想谷歌但我只能得到一些模糊和令人困惑的结果。有没有人处理过这个问题?一些示例代码会有很大的提升。

+1

的[Visual Studio 2010中安装项目的64位创建注册表项问题]可能重复( http://stackoverflow.com/questions/7384270/visual-studio-2010-setup-project-64-bit-create-registry-key-issue) – 2012-08-04 15:15:16

回答

24

您可以使用RegistryKey.OpenBaseKey来解决这个问题:

var baseReg = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry64); 
var reg = baseReg.CreateSubKey("Software\\Test"); 
+5

仅在.NET 4+中 – Kevin 2015-03-04 17:36:15

+0

我正在寻找一个如何使用RegistryView.Registry64的例子,偶然在这里找到它。没有一个M $ docs有一个例子,他们只是说使用它。当我让它读取常规卸载时,我的任何CPU应用程序正在读取wow6432uninstall。这是解决方案 – sdjuan 2016-10-13 02:46:11

+2

不要忘记配置baseReg! using(var baseReg = ...){..} – 2017-09-01 09:57:17

7

在WOW64下,某些注册表项被重定向(SOFTWARE)。当32位或64位应用程序针对重定向的键进行注册表调用时,注册表重定向程序会拦截该调用并将其映射到键的相应物理注册表位置。有关更多信息,请参见Registry Redirector

您可以使用RegistryKey.OpenBaseKey Method上的RegistryView Enumeration明确打开32位视图并直接访问HKLM \ Software \。

+0

只能在.net 4+框架中使用.net 3.5应用程序? – Kevin 2015-03-04 17:37:21

+2

@Kevin在.net 4之前,您必须调用本地API [RegOpenKeyEx](https://msdn.microsoft.com/en-us/library/ms724897(VS.85).aspx)传递[KEY_WOW64_32KEY或KEY_WOW64_64KEY](https://msdn.microsoft.com/en-us/library/windows/desktop/aa384129(v = vs.85).aspx)标志。 – 2015-03-05 06:59:16

10

我不知道如何使用.reg文件解决它。但是只能在BAT文件中使用,如下所示:

您必须在命令行末尾添加/reg:64。 例如:

REG ADD "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Authentication\LogonUI\Background" /v "OEMBackground" /t REG_DWORD /d 0x00000001 /f /reg:64 

来源:Wow6432Node and how to Deploy Registry settings to 64 bit systems via Sccm

+0

不错!正是我想要的,谢谢。 – Ron 2015-04-13 00:36:29

0

这里是我已经发展到双方工作的代码读取和写入只32位注册表。它适用于32位和64位应用程序。如果未设置该值,则“读取”调用会更新注册表,但非常明显的是如何删除该值。它需要.Net 4.0,并使用OpenBaseKey/OpenSubKey方法。

我目前使用它来允许64位后台服务和32位托盘应用程序无缝地访问相同的注册表项。

using Microsoft.Win32; 

namespace SimpleSettings 
{ 
public class Settings 
{ 
    private static string RegistrySubKey = @"SOFTWARE\BlahCompany\BlahApp"; 

    public static void write(string setting, string value) 
    { 
     using (RegistryKey registryView = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry32)) 
     using (RegistryKey registryCreate = registryView.CreateSubKey(RegistrySubKey)) 
     using (RegistryKey registryKey = registryView.OpenSubKey(RegistrySubKey, true)) 
     { 
      registryKey.SetValue(setting, value, RegistryValueKind.String); 
     }   
    } 
    public static string read(string setting, string def) 
    { 
     string output = string.Empty; 
     using (RegistryKey registryView = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry32)) 
     using (RegistryKey registryCreate = registryView.CreateSubKey(RegistrySubKey)) 
     using (RegistryKey registryKey = registryView.OpenSubKey(RegistrySubKey, false)) 
     { 
      // Read the registry, but if it is blank, update the registry and return the default. 
      output = (string)registryKey.GetValue(setting, string.Empty); 
      if (string.IsNullOrWhiteSpace(output)) 
      { 
       output = def; 
       write(setting, def); 
      } 
     } 
     return output; 
    } 
} 
} 

用法: 将这个在它自己的类文件(的.cs),并把它作为这样的:

using SimpleSettings; 
string mysetting = Settings.read("SETTINGNAME","DEFAULTVALUE");