2010-05-16 8 views
11

Estoy trabajando en un Windows de 64 bits y mi aplicación se ejecuta con privilegios elevados. Tengo un problema con la siguiente pieza muy sencilla de código:C# lee datos de registro incorrectos en el sistema operativo de 64 bits

myKey = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Microsoft\Windows\CurrentVersion\Run"); 
    if (myKey != null) 
    { 
    string[] HKLMvaluenames = myKey.GetValueNames(); 
    } 

Pero por alguna variedad razón HKLMvaluenames se rellena con los valores de la siguiente clave:

HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Run 

¿Hay alguna forma de evitar este problema?

+1

¿Tiene que ejecutar el código en modo de 32 bits, debido a una dependencia externa/no administrada o algo así? –

+0

¿Tu aplicación está compilada como una aplicación de 32 bits? Wow64 es la capa de compatibilidad de 32 bits para sistemas operativos Windows de 64 bits. – Oded

+0

@Nick: no tengo que ejecutar en 32 bits pero también quiero que mi aplicación pueda funcionar en sistemas operativos de 32 bits (esto es muy importante). @Oded: Sí, sé lo que es wow64. Mi aplicación está compilada usando VX2010 Express, así que supongo que ni siquiera puedo elegir cómo se compila. ¿Puedo verificarlo en algún lado? – baal80

Respuesta

17

Esto es por diseño, los programas de 32 bits tienen una vista diferente del registro que los programas de 64 bits. Se redirigen a la clave HKLM \ Software \ Wow6432Node cuando intentan leer un valor de la sección HKLM \ Software. Si construye su programa C# con Project + Properties, pestaña Build, Platform Target = Any CPU, se ejecutará como un programa de 64 bits y no se redireccionará.

Los programas de 32 bits pueden cancelar la redirección pero eso no se hace fácilmente con la clase .NET RegistryKey. P/Se requiere invocar RegOpenKeyEx con la opción KEY_WOW64_64KEY. Más información está disponible en este Windows SDK article.


EDIT: esto ahora también está disponible para .NET con el método() .NET 4 RegistryKey.OpenBaseKey específico. Pase RegistryView.Registry64 para ver el registro como lo haría un proceso de 64 bits.

5

mientras corría en una misma emisión o mismo enfoque de la razón de este tema, he encontrado una solución.

Utilice esta:

//To set the Base to the right path set RegistryView to DEFAULT, Registry64 or Registry32 regarding the path you need. If you want to go over the x64 root: 

RegistryKey rk = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry64) 
     .OpenSubKey(@"SOFTWARE\Microsoft\Windows\CurrentVersion\Run"); 

Ahora se comportará de la manera deseada.

divertirse!

Cuestiones relacionadas