2012-08-04 18 views
26

Estoy tratando de insertar algunas claves de registro simples usando Microsoft.Win32.RegistryKey en C# pero el camino cambia automáticamente de:Evitar Registro Wow6432Node redirección

HKEY_LOCAL_MACHINE\SOFTWARE\Test 

a

HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Test 

Probé Google pero solo obtengo algunos resultados vagos y confusos. ¿Alguien ha tratado este tema antes? Algún código de ejemplo sería muy apreciado.

+1

posible duplicado de [Visual Studio 2010 Configuración del Proyecto 64 bits Crear problema clave de registro] (http://stackoverflow.com/questions/7384270/visual-studio-2010-setup-project-64-bit-create-registry-key-issue) –

Respuesta

24

Puede utilizar RegistryKey.OpenBaseKey para resolver este problema:

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

solo en .NET 4+ – Kevin

+0

Estaba buscando un ejemplo de cómo usar RegistryView.Registry64 y lo encontré aquí por accidente. Ninguno de los documentos de M $ tiene un ejemplo, solo dicen usarlo. Mi aplicación de CPU estaba leyendo wow6432uninstall cuando le dije que leyera la desinstalación normal. Esta es la solución – sdjuan

+2

¡No olvide desechar baseReg! usando (var baseReg = ...) {..} –

7

En WOW64, se redirigen ciertas claves de registro (SOFTWARE). Cuando una aplicación de 32 bits o de 64 bits realiza una llamada de registro para una clave redirigida, el redirector de registro intercepta la llamada y la asigna a la ubicación del registro físico correspondiente de la clave. Para obtener más información, consulte Registry Redirector.

Puede usar el RegistryView Enumeration en RegistryKey.OpenBaseKey Method para abrir la vista de 32 bits de forma explícita y acceder a HKLM \ Software \ directamente.

+0

solo en el framework .net 4+, qué ocurre con las aplicaciones .net 3.5 ? – Kevin

+2

@Kevin Antes de .net 4 debe llamar a la API nativa [RegOpenKeyEx] (https://msdn.microsoft.com/en-us/library/ms724897 (VS.85) .aspx) pasando uno de los [KEY_WOW64_32KEY o KEY_WOW64_64KEY] (https://msdn.microsoft.com/en-us/library/windows/desktop/aa384129 (v = vs.85) .aspx) marca según corresponda. –

10

No sé cómo resolverlo usando un archivo .reg. Pero solo en un archivo BAT, como se detalla a continuación:

Debe agregar /reg:64 al final de la línea de comando. ejemplo:

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

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

+0

¡Agradable! exactamente lo que estaba buscando, gracias. – Ron

0

Aquí está el código de trabajo que he desarrollado a leer y escribir sólo la Registro de 32 bits. Funciona tanto en aplicaciones de 32 bits como de 64 bits. La llamada de 'lectura' actualiza el registro si el valor no está establecido, pero es muy obvio cómo eliminarlo. Requiere .Net 4.0 y utiliza los métodos OpenBaseKey/OpenSubKey.

Actualmente lo uso para permitir que un servicio en segundo plano de 64 bits y una aplicación de bandeja de 32 bits accedan a las mismas claves de registro sin problemas.

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; 
    } 
} 
} 

Uso: Ponga esto en él del archivo de clase propia (Cs) y llamarlo como tal:

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