30 abril 2011

Bad image format exception en 64 bits (juegos con SDL que dejan de funcionar)


Los períodos de transición en el software suelen tener un problema: a veces las cosas dejan de funcionar por culpa de los cambios.

Hace poco me he encontrado con uno de esos casos: juegos creados en C# usando SDL, que funcionan correctamente en Windows XP, en Windows 7 de 32 bits... y que en cambio no funcionan en Windows 7 de 64 bits. En concreto, el mensaje de error que devuelven es "Bad image format exception" (excepción provocada por un formato incorrecto de imagen).

Si se tiene acceso al código fuente, es fácil de solucionar: hay que cambiar la plataforma de destino de nuestro proyecto, para que en vez de ser "Any CPU" (cualquier procesador), sea "X86". En Visual Studio 2008 se hacia apenas en un par de clics, pero en Visual Studio 2010 está un poco más escondido.

Los pasos que habría que dar en Visual C# 2010 Express serían:

1) Abrir nuestro proyecto.


2) En la propia barra de herramientas deberíamos poder escoger el "destino" de nuestro proyecto: tanto si es una versión de depuración (Debug) o una definitiva (Release), como el tipo de procesador de destino, que en principio debería ser "Any CPU" (cualquier procesador).


3) Es posible que sólo tengamos la opción "Any CPU" y no se nos permita escoger "X86", que es el nombre genérico para un procesador de 32 bits, y que es la opción que deberemos elegir, porque es lo que esperan las librerías auxiliares que emplea nuestro juego. En ese caso, entramos al menú Generar, y a la opción "Administrador de configuración":



4) Si en la opción de "plataforma", desplegamos la lista correspondiente e "Any CPU", veremos que no tenemos más opciones disponible, pero que podemos añadirlas (con la opción "Nueva..."):



5) Entonces nos mostrarán las demás plataformas que podemos escoger, y que deberían ser Itanium, X64, y (como pretendíamos) X86:


6) Ahora el "Administrador de configuración" debería parecerse más a lo que buscamos:


7) Y la propia barra de herramientas nos debería permitir escoger que nuestro proyecto sea para la plataforma X86:


8) Finalmente, no está de más comprobar que en nuestro proyecto ha quedado también "X86" como destino. Lo haríamos desde el menú "Proyecto", en la opción "Propiedades de...", y dentro de la pestaña "Generar":



Con eso, nuestro juego ya debería funcionar correctamente bajo Windows 64 bits.

¡ Suerte !

3 comentarios:

Anónimo dijo...

esto es posible con cualquier aplicacion hecha en C# .net 2010 ? yo tengo un programa que usa sql server y me ha fallado en win7 64 bits, precisamente con este error "bad image format exception", y revise la parte que tu explicas y si lo tenia en any

Nacho Cabanes dijo...

Lo importante no es que ponga "Any" sino "x86" (si se trata de una DLL antigua para Windows 32 bits)

Anónimo dijo...

grax Nacho, funcionó de maravilla