2010-02-04 10 views
13

Tengo un instalador de Visual Studio que está creando algunas claves de registro:Crear 64 clave de registro de bits (no WOW64) desde una aplicación de 32 bits

HKEY_LOCAL_MACHINE\SOFTWARE\MyApp 

pero las claves de registro que está creando aparecen automáticamente bajo Wow6432Node :

HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\MyApp 

¿Cómo ignorar la Wow6432Node al crear claves de registro en mi código C# de ser ejecutado por el MSI?

+0

Supongo que, dado que su aplicación es de 32 bits, Windows se asegura de que los cambios estén bajo el 'Wow6432Node'. Para sacarlo de ese nodo y colocar las entradas en las rutas normales, su aplicación debe ser de 64 bits. – legends2k

Respuesta

21

Just FYI, .NET 4.0 lo admite de forma nativa. Ejemplo:

RegistryBase = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry64); 

A continuación, puede utilizar ese RegistryBase variable para acceder a cualquier cosa en la vista de 64 bits de HKLM. Por el contrario, Registry32 permitirá que una aplicación de 64 bits acceda a la vista de 32 bits del registro.

+1

gran respuesta. simple y al grano. – Simon

1

Eche un vistazo a http://www.pinvoke.net/default.aspx/advapi32/regopenkeyex.html. Tendrá que usar el redirector de registro y pasar el valor correcto para la máscara de acceso. Lamentablemente necesitarás pInvoke.

+0

Oh fantástico. ¿Hay alguna buena API .NET alrededor de la que alguien haya escrito para envolver las llamadas pinvoke y hacer que no sea tan terrible? –

+0

No diría que es realmente terrible. Un poco incómodo tal vez. Solo agregue las DllImports y defina KEY_WOW64_64KEY. Un ejemplo más conciso (para su eliminación) se puede encontrar en http://geekswithblogs.net/derekf/archive/2007/06/26/113485.aspx. – nithins

1

Dado que hay muy poca documentación sobre OpenBaseKey, Voy a ampliar sobre la respuesta de shifuimam y proporcionar una solución para el OP:

Private Sub Foo() 
    Dim myAppIs64Bit = Environment.Is64BitProcess 
    Dim baseKey As RegistryKey 
    If (myAppIs64Bit) Then 
     baseKey = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry64) 
    Else 
     baseKey = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry32) 
    End If 
    Dim myAppKey As RegistryKey = baseKey.OpenSubKey("SOFTWARE\MyApp") 
End Sub 

Si la aplicación es de 32 bits, myAppKey puntos a HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\MyApp. Si es de 64 bits, apunta a HKEY_LOCAL_MACHINE\SOFTWARE\MyApp.

La ventaja de OpenBaseKey es que elimina la necesidad de hacer referencia a Wow6432 en su código.

Cuestiones relacionadas