"Se intentó cargar un programa con un formato incorrecto" incluso cuando las plataformas son las mismas

461

Llamo funciones desde una DLL no administrada de 32 bits en un sistema de 64 bits. Lo que obtengo es:

BadImageFormatException: se intentó cargar un programa con un formato incorrecto. (Excepción de HRESULT: 0x8007000B)

Al principio, tenía mis proyectos configurados en la plataforma Any CPU, así que los cambié a ambos a x86, pero este error sigue ocurriendo. Esa es realmente la única solución que sé para esto.

Las DLL no están dañadas ni nada, porque puedo usarlas con otros programas (para los que no tengo la fuente). Pensé que tal vez no estaba encontrando una dependencia, pero lo comprobé y todos están allí. Además, ¿no arrojaría un DllNotFoundExceptionen ese caso?

¿Que más puedo hacer? Y antes de decir "Use una DLL no administrada de 64 bits en su lugar", permítame señalar que no hay una. ;)

David Brown
fuente
1
¿Qué proyectos cambiaste a x86? ¿Y cómo los ejecuta cuando obtiene la excepción, a través del depurador o manualmente? Si es esto último, ¿notó que cuando cambió a x86, obtuvo una nueva carpeta en su directorio bin \? Básicamente ahora es bin \ x86 \ Debug para los archivos.
Lasse V. Karlsen
¿Puede verificar que el ejecutable se esté ejecutando en modo de 32 bits (* 32 en el administrador de procesos)?
JP Alioto
@Lasse V. Karlsen: Sí, eliminé el bit x86 de la ruta de salida cuando cambié la plataforma en cada proyecto. Mi primer proyecto es una DLL que envuelve las funciones en la DLL no administrada. El segundo proyecto es un ejecutable que usa el contenedor en la primera DLL. Ambos están configurados en x86.
David Brown
@JP: En realidad, el administrador de procesos no muestra que se esté ejecutando como un proceso de 32 bits. ¿Porqué es eso?
David Brown

Respuestas:

532

Si intenta ejecutar aplicaciones de 32 bits en IIS 7 (y / o en una máquina con sistema operativo de 64 bits), obtendrá el mismo error. Entonces, desde IIS 7, haga clic derecho en el grupo de aplicaciones de las aplicaciones y vaya a "configuración avanzada" y cambie "Habilitar aplicaciones de 32 bits" a "VERDADERO".

Reinicie su sitio web y debería funcionar.

ingrese la descripción de la imagen aquí

bluwater2001
fuente
1
Oh, mis días he estado buscando instalar componentes IIS adicionales cuando esta fue la respuesta ... ¿Alguien puede sugerir una desventaja de tener esta opción seleccionada?
notidaho
3
Aquí hay una buena discusión sobre la cuestión del rendimiento con respecto a esto: stackoverflow.com/questions/507820/…
Ben Power
Tengo un problema con SharpSvn y esto no ayuda. :( Algo está muy mal con este ensamblado, te lo digo ...
user2173353
44
Esta respuesta es una pregunta para mí, porque la pregunta no menciona IIS en absoluto
kristianp
129

De alguna manera, la casilla de verificación Construir en el Administrador de configuración había sido desmarcada para mi ejecutable, por lo que todavía se estaba ejecutando con la antigua versión Any CPU. Después de arreglar eso, Visual Studio se quejó de que no podía depurar el ensamblaje, pero eso se solucionó con un reinicio.

David Brown
fuente
Muchas gracias. Esto también me atrapó. Comprobado compilación en Configuration Manager y ahora funciona (aplicación de escritorio WPF).
Danglund
1
Si ha hecho todo lo anterior y comprobó la configuración de su plataforma, creó la configuración, limpió la solución y aún no funciona: busque todas las instancias de la DLL y elimínelas.
Will Calderwood
con VS 2015 esto todavía es válido, aunque no tuve que reiniciar :)
increddibelly
¡Eso es! Volver a visitar la configuración de Configuration Manager es la respuesta.
AndyUK
74

En Visual Studio , haga clic con el botón derecho en su proyecto -> En el panel izquierdo, haga clic en la pestaña Generar ,

Propiedades del proyecto, pestaña de compilación

en Destino de plataforma, seleccione x86 (o más generalmente, la arquitectura para que coincida con la biblioteca a la que se está vinculando)

Propiedades del proyecto, objetivo de la plataforma

¡Espero que esto ayude a alguien! :)

Marvin Thobejane
fuente
2
Esto solucionó mi problema en VS2013, encontré que una solución alternativa es dejar el "Objetivo de la plataforma" como "Cualquier CPU", pero marque la casilla de verificación "Preferir 32 bits".
user1069816
2
Aunque necesita usar .NET 4.5 o superior para poder marcar la casilla de verificación "Preferir 32 bits"
user1069816
1
Sí, pero convertí mi proyecto en 'Cualquier CPU' a 'x64'. Mi proyecto de 32 bits funciona bien pero el mismo código que convertí a 64 bits, ese proyecto no funciona bien como 32 bits. ¿Me puede dar el proceso de conversión de 64 bits adecuado ...
Ismayil S
@IsmayilS asegúrate de estar usando una versión de 64 bits de la biblioteca a la que te estás conectando
Marvin Thobejane
53

Acabo de tener este problema también. Intenté todas las sugerencias aquí, pero no ayudaron.

Encontré otra cosa para verificar que me lo arregló. En Visual Studio, haga clic derecho en el proyecto y abra "Propiedades". Haga clic en la pestaña "Compilar" (o "Compilar") y luego haga clic en "Opciones de compilación avanzadas" en la parte inferior.

Verifique el menú desplegable "CPU objetivo". Debe coincidir con la "Plataforma" que está construyendo. Es decir, si está construyendo "Cualquier CPU", entonces "CPU de destino" debería decir "Cualquier CPU". Revisa todas tus plataformas activándolas y verifica esta configuración.

Denis
fuente
2
Y para aquellos de nosotros que solo usamos el compilador, mi solución fue agregar "/ platform: x86" a los indicadores del compilador.
Erizo
Esto también me lo arregló. Tuve que ajustar el "objetivo de la plataforma" en la pestaña "Construir".
Jowen
si tiene 64 bits, también marque la opción "prefiera 32 bits". Tuve que desactivarlo por mí.
N4ppeL
51

Si encuentra este error cuando hace clic en el botón de flecha verde para ejecutar la aplicación, pero aún así desea ejecutar la aplicación en 64 bits. Puede hacer esto en VS 2013, 2015, 2017 y 2019

Vaya a: Herramientas> Opciones> Proyectos y soluciones> Proyectos web> Use la versión de 64 bits de IIS Express

paibamboo
fuente
3
Gracias. Intenté muchos y nada me ayudó. Eres mi salvavidas. Tengo un sistema operativo de 64 bits, instalé un estudio visual de 64 bits [que todavía funciona como 32 bits por razones desconocidas]. Cuando puse mi Target Platform en x64, arrojaba el error BadImageFormatException. Con su solución, funcionó. Te di un voto a favor. Tu rock
SKCS Kamal
Me alegro de poder ayudar :)
paibamboo
Esta es la respuesta que necesito. ¡Muchas gracias!
yushulx
Muchas gracias, esto resolvió el problema. Funciona bien con el proceso de Visual Studio 2017 de 32 bits.
samir105
1
todavía funciona con VS 2019, gracias
Jake Gaston
36

Si está utilizando Any CPU , puede encontrar este problema si la opción Preferir de 32 bits está marcada:

¡Asegúrese de desmarcar esta opción en la pestaña Construir de la propiedad del proyecto !

ingrese la descripción de la imagen aquí

Drew Noakes
fuente
3
Sería útil si pudiera indicar en qué lugar de Visual Studio encontrar esta opción.
trysis
@trysis, esta opción está en la página Build del panel de configuración del proyecto.
Drew Noakes
1
Estaba diciendo que sería útil incluirlo. Tal como está esta respuesta, no hay contexto para decirle al desafortunado y posiblemente nuevo usuario de StackOverflow dónde encontrarlo.
trysis
¿Cuál es el camino para obtener este formulario? No puedo encontrarlo
Adolfo Correa
En Visual Studio, haga clic derecho en el proyecto y elija 'Propiedades'.
Drew Noakes
8

Un poco fuera de tema para esta publicación, pero la búsqueda de este mensaje de error me trajo aquí.

Si está compilando a través del sistema de equipo y obtiene este error, la pestaña del proceso de definición de compilación tiene una configuración de "Plataforma MSBuild". Si está configurado en "Auto", puede experimentar este problema. Cambiarlo a "X86" también puede resolver el error.

StingyJack
fuente
Esta es la respuesta más cercana a lo que estaba experimentando. Tenía un dll que tenía que ser x86. Lo usé en otro proyecto, que era AnyCPU por defecto. Solo necesitan coincidir. En este caso, no hizo mucha diferencia, así que cambié el nuevo proyecto a x86.
greg
8

En mi caso, estaba usando una DLL nativa en C #. Esta DLL dependía de algunas otras DLL que faltaban. Una vez que se agregaron esas otras DLL, todo funcionó.

Tomasz Stypich
fuente
4

Sobre la base de la respuesta de @paibamboo

Él dijo: Vaya a: Herramientas> Opciones> Proyectos y soluciones> Proyectos web> Use la versión de 64 bits de IIS Express

Mi compañero de trabajo tenía esta casilla marcada (lo buscó explícitamente), pero tenía el mensaje de error en cuestión. Después de algunas horas, desmarcó la casilla y la volvió a marcar. Lo y he aquí: el código ahora se ejecutó con éxito.

Parece que hay dos lugares donde se guarda el estado de este cuadro que no está sincronizado. Descomprimirlo y volver a verificarlo lo sincronizó nuevamente.

Pregunta para usuarios más conocedores: ¿Hubo una actualización o algo la semana pasada (para VS 2015) que desincronizó los estados?

MilConDoin
fuente
3

También vea esta respuesta , que resolvió el mismo problema para mí.

Publicado por Luis Mack el 12/05/2010 a las 8:50 AM. He encontrado el mismo problema, solo para un proyecto específico al compilar en una máquina de 64 bits. Una solución que PARECE funcionar es alterar manualmente un carácter en la secuencia de imágenes CADA VEZ que el control del usuario o el formulario se editan en el diseñador

 AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj00LjAuMC4w

Cambiar a

 AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj0yLjAuMC4w

Eso es 00LjAuMC4w de regreso a 0yLjAuMC4w al final de la línea (00 de regreso a 0y)

Shaul Behr
fuente
1
Un breve resumen del enlace sería útil @Shaul :)
Marvin Thobejane
Magnífico. Gracias, la sesión informativa agrega contenido a su comentario
Marvin Thobejane
2

En mi caso, estoy usando un pequeño .exe que vuelve a cargar las DLL a las que se hace referencia a través de Reflection. Así que solo hago estos pasos que me salvan el día:

Desde las propiedades del proyecto en el explorador de soluciones, en la pestaña de compilación, elijo la plataforma objetivo desde x86

asdf_enel_hak
fuente
2

En mi caso, estaba ejecutando pruebas a través de MSTest y descubrí que estaba implementando una DLL de 32 bits y de 64 bits en el directorio de prueba. El programa favorecía la DLL de 64 bits y hacía que fallara.

TL; DR Asegúrese de implementar solo DLL de 32 bits para las pruebas.

Mike Cluck
fuente
2

Tuvimos un problema similar y logramos solucionarlo estableciendo el objetivo de la Plataforma en x86. Propiedades del proyecto-> construir

Joe
fuente
¿Entonces x86 dlls son diferentes de x64? ¿Hay alguna manera de detectar esto en un archivo dll referenciado?
NoBugs
@NoBugs Parece que puedes. Echa un vistazo a este hilo
Joe
1

Tengo este problema resuelto en la forma de 'Windows'. Después de verificar todas mis configuraciones, limpiar la solución y reconstruirla, simplemente cierro la solución y la vuelvo a abrir. Luego funcionó, por lo que VS probablemente no se deshizo de algunas cosas durante la limpieza. Cuando las soluciones lógicas no funcionan, suelo recurrir a soluciones ilógicas (o aparentemente ilógicas). Windows no me decepciona. :)

usuario1771386
fuente
1

Pude solucionar este problema haciendo coincidir mi versión de compilación con la versión .NET del servidor.

Hice doble clic en el .exe solo para ver qué sucedería y me dijo que instalara 4.5 ...

¡Así que bajé a 4.0 y funcionó!

Así que asegúrese de que sus versiones coincidan. Funcionó bien en mi cuadro de desarrollo, pero el servidor tenía una versión anterior de .NET.

Nateous
fuente
1

En mi caso, el contenido del archivo era incorrecto. La DLL se descargó de la web, pero el contenido de la DLL era una página HTML: D Intente verificar si es un archivo binario, si parece que la DLL es correcta :)

Ludwo
fuente
1

Estábamos teniendo el mismo problema en .NET core. La solución fue descargar .netcore runtime de 32 bits y tener el objetivo de su proyectox86

En su csprojarchivo agregue

  <PropertyGroup>
    <PlatformTarget>x86</PlatformTarget>  
  </PropertyGroup>

  <PropertyGroup>
    <RunCommand Condition="'$(PlatformTarget)' == 'x86'">$(MSBuildProgramFiles32)\dotnet\dotnet</RunCommand>    
  </PropertyGroup>

Esto se usó para una máquina Windows, tendrías que ajustar las rutas y tal para Linux / OSX

Samir Banjanovic
fuente
0

Si está importando una DLL no administrada, use

CallingConvention = CallingConvention.Cdecl 

en su método de importación de DLL.

Ramkumar Shanmugam
fuente
0

1: Vaya a: Herramientas> Opciones> Proyectos y soluciones> Proyectos web> Use la versión de 64 bits de IIS Express 2: cambie la configuración a continuación para el proyecto de servicio web. ingrese la descripción de la imagen aquí

Mani
fuente