Forzar la ejecución en 32 bits de aplicaciones .Net
Los sistemas de 64 bits están irrumpiendo cada vez con mayor fuerza. Hasta hace poco no era muy habitual el tener que despleguar una aplicación sobre 64 bits .Una de las grandes ventajas de .Net es que esta transición es en gran medida transparente. El compilador de .Net se encargará de compilar nuestra aplicación a 32 o 64 bits según sea la plaforma sobre la que la estamos ejecutando. Esto que sin duda es una gran ventaja sobre los lenguajes nativos pues nos permite no tener que compilar explicitamente una versión de 32 y una de 64 bits, puede volverse en nuestra contra en algunas situaciones.
El problema es que en estos tiempos de transición entre plataformas muchas de nuestras aplicaciones de .Net que utilizan aun componentes nativos de 32 bits, pueden encontrarse con problemas. Y es que muchos fabricantes de componentes aun están adecuando sus componentes nativos a 64 bits. El problema es que si nuestra aplicación de .Net usa esos componentes de 32 bits nativos y sin embargo se ejecuta sobre una plataforma de 64 bits el 'casque' es inevitable ya que no se podrán cargar los componentes de 32 bits en un proces de 64 bits.
Los componentes afectados por esta situación son muchísimos y de muchos fabricantes. Yo he sufrido este problema con proveedores de datos de Microsott para Oracle, con componentes de Active Reports (estos ya han solucionado la papeleta), con librerías de comunicación de dispositivos etc...
Ya hablá de este problema y de como solucionarlo en aplicaciones Asp.net, hoy toca ver que podemos hacer si nuestra aplicación es un ejecutable, sea un servicio, una aplicación de consola o de ventana.s
La solución pasa porque el proveedor del componente lo migre a 64 bits o por ejecutar nuestro proceso de .Net como un proceso de 32 bits aunque la máquina sea de 64 bits. Para ello basta con compilar nuestra aplicación para 32 bits (x86) en lugar de para cualquier CPU (Any CPU). La manera correcta de hacer esto en Visual Studio es crear una nueva plataforma para la solución de tipo x86:
Y luego establecer las propiedades de compilación para esta plataforma adecuadamente en las propiedes de compilación del proyecto:
Esto funciona bien cuando sabemos a priori cual es la situación. Pero lo que a veces ocurre es que descubrimos que una aplicación ya compilada no se comporta como debería en máquinas de 64 bits. Podríamos recompilarla con la configuración comentada arriba, lo que exige tener o podemos parchearla sin recompilarla para forzar su ejecución en 32 bits. Para ello en el framework de .Net tenemos una herramienta llamada corflags que nos pemite marcar cualquier ejecutable de .Net para que se fuerce su ejecución como 32 bits aunque el sistema sea de 64 bits.
Unsando el comando Cordflags MiAplicacion.exe /32BIT+ nuestra aplicación será capaz de utilizar los componentes de 32 bits sin ningún problema en una máquina de 64 bits.