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.

Published 14/5/2008 21:26 por Rodrigo Corral
Archivado en:
Comparte este post:
http://geeks.ms/blogs/rcorral/archive/2008/05/14/forzar-la-ejecuci-243-n-en-32-bits-de-aplicaciones-net.aspx

Comentarios

# re: Forzar la ejecución en 32 bits de aplicaciones .Net

Jodío, me haces modificar algo que tengo a medio escribir.

:-)

Gracias y un tip genial.

:-)

Thursday, May 15, 2008 12:04 AM por Rafael Ontivero

# re: Forzar la ejecución en 32 bits de aplicaciones .Net

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 :)

Thursday, May 15, 2008 12:10 AM por Iratxo

# re: Forzar la ejecución en 32 bits de aplicaciones .Net

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:

lonifasiko.blogspot.com/.../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:

en.wikipedia.org/.../WOW64

SaludoX.

Thursday, May 15, 2008 8:23 AM por lonifasiko

# re: Forzar la ejecución en 32 bits de aplicaciones .Net

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..

Thursday, May 15, 2008 4:02 PM por J

# re: Forzar la ejecución en 32 bits de aplicaciones .Net

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...

Thursday, May 15, 2008 4:51 PM por Rodrigo Corral

# re: Forzar la ejecución en 32 bits de aplicaciones .Net

Esto mismo funciona en visual basic 2005 express????

Saturday, June 28, 2008 12:50 AM por CarlosRQ

# re: Forzar la ejecución en 32 bits de aplicaciones .Net

Perfectamente, CarlosRQ.

Sunday, June 29, 2008 11:00 PM por Rodrigo Corral

# re: Forzar la ejecución en 32 bits de aplicaciones .Net

Podrías revisar que ha pasado con las imágenes que no se ven.

Gracias.

Thursday, October 02, 2008 2:28 PM por Víctor González

# re: Forzar la ejecución en 32 bits de aplicaciones .Net

Ya se ven las imagenes, es curioso el problema, se ha solucionado simplemente con un iisreset... ¡gracias por avisar!

Thursday, October 02, 2008 7:53 PM por Rodrigo Corral

# re: Forzar la ejecución en 32 bits de aplicaciones .Net

Todo muy bien cuando es una aplicacion en VB, pero como seria el procedimiento para una pagina ASPX

Saturday, March 28, 2009 2:59 PM por Ruperto

# re: Forzar la ejecución en 32 bits de aplicaciones .Net

Hola Ruperto:

Tienes la respuesta en este artículo:

geeks.ms/.../problema-con-aplicaciones-asp-net-de-32-bits-en-servidores-de-64-bits.aspx

¡Un saludo!

Saturday, March 28, 2009 5:43 PM por Rodrigo Corral