2010-03-22 9 views
6

Estoy trabajando en una aplicación de consola .NET 3.5 en C# que usa una DLL no administrada de VC++. Se ejecutó sin problemas cuando trabajé en él hace unas semanas, pero vuelvo hoy y ahora obtengo una BadImageFormatException ("Se intentó cargar un programa con un formato incorrecto. (Excepción de HRESULT: 0x8007000B)).Causa alternativa de BadImageFormatException en .NET Assembly?

Mi estación de trabajo de desarrollo ejecuta Windows 7 de 64 bits y trabajo mucho con código no administrado, por lo que inmediatamente compruebo que el ensamblado .NET y la biblioteca VC++ tienen objetivos x86. Lo hicieron.

sólo para estar seguro, he limpiado y reconstruido biblioteca de la VC++ y el ensamblado de .NET, sin ningún resultado.

Ninguno de estos sistemas está haciendo nada particularmente inusual. el VC++ cargas biblioteca un dat binaria un archivo y realiza un procesamiento matemático de sus contenidos. El ensamblado .NET tiene DllImports para la biblioteca y algún código para conectarlo. Todo esto funcionó hace unas semanas.

Así que ahora me pregunto si hay alguna otra causa de BadImageFormatException que sea menos común que un conflicto x86/x64 con el que me pueda encontrar.

Gracias.

EDIT: Obtengo el mismo error independientemente del modo x86 o x64, pero cuando se establece en 'Cualquier CPU', la ejecución pasa ese punto, pero la ejecución finaliza en una llamada posterior a la biblioteca VC++ sin excepción. Independientemente de si eso está relacionado con este problema, ¿hay algo que 'Cualquier CPU' haga de manera diferente tanto de x86 como de x64, lo que podría arrojar algo de luz sobre esto?

+0

¿Hay alguna posibilidad de que la aplicación en ejecución tenga acceso a una versión x64 de la biblioteca de VC++ y que esté intentando cargar esa en su lugar? ¿O su aplicación en ejecución podría estar apuntando a AnyCPU y no a x86? AnyCPU se cargará en 64 bits si se encuentra en un entorno de 64 bits. – Anzurio

+0

Buenas preguntas. El primero no parece ser el caso, intenté copiar el proyecto en otra máquina que nunca tuvo una copia de la biblioteca, teniendo cuidado de copiar solo la versión x86 del ensamblaje. El mismo problema ocurrió en la otra máquina. La aplicación está definitivamente configurada en x86. Por curiosidad lo configuré para ejecutar en 'Cualquier CPU'. Cuando lo hago, pasa la primera llamada a la biblioteca de VC++ (donde muere cuando se establece en x86 o x64), pero la ejecución finaliza durante una llamada posterior a la biblioteca. –

+0

Ejecute Dependency Walker x86 en su .exe y luego en su .dll. Tuve este problema una vez después de copiar msvcr120.dll de system32 en una máquina de 64 bits. Oy! –

Respuesta

3

Quizás esté intentando cargar un ensamblaje creado para CLR 4.0 en CLR 2.0.

+0

Gracias por la respuesta rápida, pero no tenemos ninguna instalación de Visual Studio 2010 aquí, entonces no CLR 4.0. –

2

Dado el uso de código nativo aquí, creo que el problema más probable aquí es que está intentando cargar una DLL nativa como si fuera un ensamblado .Net. Este es un escenario que generará un BadImageFormatException.

Intenta ejecutar tu aplicación y configurarla para que se rompa en el lanzamiento para BadImageFormatException y ver qué DLL se está cargando. Si es nativo, ese es el problema.

4

Cuando obtengo este error, siempre se produce al cargar una DLL de 32 bits en un proceso de 64 bits.

Establezca el archivo EXE para compilar en x86 y ver si funciona.

+0

Como dije en la pregunta inicial, todo está configurado en x86. –

+0

Esto me ayudó, muchas gracias. – ChaosPandion

+0

Me salvó las horas + – Xaqron

3

¡Compruebe si hay un conflicto de carga .dll!

Estaba llamando a un dll C++/CLI desde C#; la biblioteca C++/CLI es un contenedor alrededor de una dll nativa de un tercero.

Resulta que tenía dos dlls con el mismo nombre, ambos en la ruta (libeay32.dll).

Con el fin de descubrir la fuente del problema I instalado Windows herramientas de depuración: http://www.microsoft.com/whdc/devtools/debugging/default.mspx

'gflags' Run (en la "C:... \ Archivos de programa \ Herramientas de depuración" carpeta) con el fin de habilitar la visualización del cargador "instantáneas"

ie

> gflags -i <my test app.exe> +sls 

continuación, ejecute la aplicación en CDB (consola depurador) o windbg y arrastre a través de la salida para saber qué DLL provocó la excepción.

p. Ej.

> cdb -g <my test app.exe> 

Renombrando el 'malo' libeay32.dll demostró el problema, pero es solo una solución temporal.

El mismo enfoque de detección de fallos podría funcionar para usted de todos modos.

0

En mi caso, desactivar Enable unmanaged code debugging en la pestaña Debug de las propiedades del proyecto EXE irónicamente hizo el truco, si está marcado.

Para ser sincero, no estoy seguro de por qué esa es la causa del problema.