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?
¿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
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. –
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! –