Error en IIS BadImageFormatException

Subiendo una aplicación web al servidor me encontré con un error muy raro y que hasta el momento no me había pasado nunca.

Error System.BadImageFormatException !!!

La página del error en el IIS es:

 

La aplicación hasta ese momento estaba funcionando y después de añadirle un nuevo ensamblado  Masivos.Application.Interfaces dejó de funcionar. Lo curioso es que en el servidor de desarrollo funcionaba perfectamente, pero en el servidor de Pre no había manera que funcionara.

Lo primero que tenemos que saber es que la máquina de desarrollo estaba corriendo en un Windows7  32bits y el servidor de Pre en un Windows Server 2008 R2 64 bits.

La configuración de la solución

Lo primero que hay que mirar es la configuración de la solución.

 

A simple vista se ve algo raro, justamente el proyecto que está fallando esta compilando siempre en x86 y eso no es lo correcto, la compilación tendría que ser igual que el resto de proyectos de librerías para Any CPU. Lo peor de todo es que al intentar modificar esta configuración no aparece la opción y solo permite compilar para x86.

El porqué de todo esto

El error está bastante claro: Una DLL o aplicación ejecutable se carga como un ensamblado de 64 bits, pero contiene características o recursos de 32 bits. Por ejemplo, usa la interoperabilidad COM o llama a métodos en una biblioteca de vínculos dinámicos de 32 bits.  http://msdn.microsoft.com/es-es/library/system.badimageformatexception.aspx.

Mis intentos para solucionar el problema pasaron por:

1.       intentar obligar al pool de aplicaciones del IIS en que la solución corriera en x86. FAIL !!

2.       Intentar por todos los medios que el proyecto de Interfaces se compilara en Any CPU. FAIL!!

 

La Solución

 

Lo que me mosqueaba era porque motivo un proyecto de librería no me dejaba poder establecer la compilación en Any CPU y la respuesta surgió cuando el que creó el proyecto comento que en principio seleccionó la plantilla de consola y luego modifico el proyecto a librerías.   Argggg !!!!!

 

 Visual Studio cuando crea un proyecto de consola siempre lo configura como x86 y la única manera de poder cambiar esto es modificando a mano la configuración del proyecto. Pues la solución rápida fue crear un nuevo proyecto directamente de librería y copiar todos los ficheros al nuevo proyecto.  Una vez todos los ensamblados compilados en 64bits el deploy funcionó y todos felices.

Experiencias del día a día de un desarrollador 😉

 

6 comentarios en “Error en IIS BadImageFormatException”

  1. Interesante,

    ” Visual Studio cuando crea un proyecto de consola siempre lo configura como x86 y la única manera de poder cambiar esto es modificando a mano la configuración del proyecto.”

    Qué implica “modificando a mano” ? programáticamente o modificando algún archivo de configuración ??

    salu2grz

  2. Implicaría modificar el fichero de configuración “según tengo entendido”. Creo que la mejor solución es crear un proyecto nuevo y no arriesgarse en modificar a manos el proyecto.

    Saludos 😉

  3. @ElQueCreoElProyecto, pues lo del .net client profile no tiene nada que ver (creo), el problema está en como se realiza la carga de ensamblados en .net (x86 o x64). Nosotros hace poco tiempo tuvimos un problema similar con los drivers de ORACLE y si bien el error era elmismo, dar con ello era imposible.

    Salu2

  4. Segun la página de Microsoft esto sucede porque una DLL o aplicación ejecutable se carga como un ensamblado de 64 bits, pero contiene características o recursos de 32 bits.Por ejemplo, usa la interoperabilidad COM o llama a métodos en una biblioteca de vínculos dinámicos de 32 bits. Por eso si tienes el control de todas las referencias como puede ser una aplicación de librerías, no tienes problemas, pero si es una aplicación de consola o un driver de terceros no puedes controlar si utilizan recursos de 32 bits.

    Saludos

  5. Pues parece que mi comportamiento es el más raro, teniendo un servidor funcionando haciendo hosting de un servicio, cuando depuro los clientes dsd VS2010 al hacer el open del servicio me parece la excepción, sin embargo, ejecutando versiones debug y release de los clientes de forma directa no aparece la excepción.

Deja un comentario

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