Leer REGEDIT en sistemas de 64Bits

 

Hola a todos, en un proyecto me presenté con un problema que no se nos había ocurrido podía pasar. Resulta que necesitábamos utilizar una DLL para realizar una tarea específica, de la cual no teníamos el fuente, la misma estaba hecha sobre VB6.0, y ésta entre otras cosas leía el registro de Windows. Para sistemas de 32 bits iba muy bien.

 

Por cambio de arquitectura  migramos muchas cosas a servicios, pero dicha clase en particular imageni si quiera sabíamos que hacía exactamente y ponernos a rehacerla era más costoso que utilizarla. Dicho esto nos tocaba hacer un servicio en C# con Framework 4.0, hacer referencia a la DLL hecha en VB6.0 (32bits) y que funcione.

 

Nos topamos con varios inconvenientes, el primero era registrar la DLL, lo cual lo hicimos con el regsvr32.exe de la carpeta System32 y SysWOW64, no determinamos al final cual fue la que sirvió.

 

Luego sobre el IIS se configuró un ApplicationPool para dicho servicio, a este pool, en la propiedad “Habilitar aplicaciones de 32 bits” (se ve en la configuración avanzada) se la estableció a “True”.

Con esto, el servicio ya podía ejecutar la DLL sin problemas.

 

El otro problema que tuvimos fue que no podíamos leer la entrada en el regedit desde la clase. Esto pasa porque como es DLL de 32bits lee las entradas en el registro solo para componentes de 32bits. Específicamente tratamos de entrar al “HKEY_LOCAL_MACHINE\SOFTWARE\MiEntradaDeRegistro” (al menos así era para sistemas de 32bits), dado que estábamos parados en un servidor de 64bits, nos tocó crear la entrada e ir a “HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\MiEntradaDeRegistro” y luego leer normalmente nuestra cadena almacenada.

image

Básicamente el código fue el siguiente:

string KeyPath = "SOFTWARE\\Wow6432Node\\MiEntradaDeRegistro";
RegistryKey key = Registry.LocalMachine.OpenSubKey(KeyPath, false);

 

Sin olvidar el “using Microsoft.Win32;”

 

Espero les sirva.

Deja un comentario