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.

12 comentarios sobre “Forzar la ejecución en 32 bits de aplicaciones .Net”

  1. Interesante post. No me había planteado el problema de la CPU en .NET, aunque hace ya mucho que no desarrollo para este entorno.

    Lo tendré en cuenta 🙂

  2. A mí me tocó hacer esta especie de migración de aplicación .NET «normal» (32 bits) a 64 bits hace un tiempo. Fue más fácil de lo esperado, como comentas, sólo tuve que cambiar el «platform target» a «x86» y listo:
    http://lonifasiko.blogspot.com/2008/02/migrando-aplicaciones-net-64-bits.html

    Por cierto, añado que el entorno o subsistema de las plataformas Windows de 64 bits que permite correr aplicaciones de 32 bits (sería nuestro caso), se denomina WOW64:
    http://en.wikipedia.org/wiki/WOW64

    SaludoX.

  3. Sin duda un tip interesante para solucionar problemas :). aunque lastima que en este caso no se estarían aprovechando los 64 bits…es decir ,se obligaría a la aplicación a renunciar al posible mejor rendimiento por los componentes nativos en 32 bits..

  4. J… el rendimiento de una aplicación que no se carga o que no carga alguno de sus módulos es cero 😉

    Pero sí, es una pena no exprimir los 64 bits… aunque las diferencias de rendimiento salvo para aplicaciones que usen una cantidad de memoria exagerada o que hagan muchísimos cálculos con números enormes es más bien poca…

  5. Hola, una consulta. Estoy usando una aplicación con esta técnica o sea, forzar la ejecución de 32 bits en cualquier ordenador. Asimismo uso Crystal Reports. Tengo un caso especifico en el que se instaló en un ordenador de 64 bits. Se ejecuta normalmente la aplicación pero el Crystal no se ejecuta, da una serie de errores. Presumo que la aplicación corre en 32 pero el Crystal se instaló en plataforma 64. Pregunto, Puede ser esto lo que se desencadena el problema? Alguna sugerencia?

    Saludos
    Carlos

Responder a anonymous Cancelar respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *