Tengo un servicio de Windows escrito en C# con Visual Studio 2010 y la orientación de la totalidad .NET Framework 4. Cuando ejecuto desde una versión de Depuración del servicio se ejecuta como se esperaba. Sin embargo, cuando se ejecuta a partir de una compilación de la Versión puedo obtener un Sistema.BadImageFormatException (detalles más abajo). He estado buscando en internet una solución, pero hasta ahora todo lo que he encontrado no me ayudó a encontrar una solución.

El problema existe tanto en Windows 7 de 64 bits (dev) y Windows XP SP3 de 32 bits (destino) de los sistemas.

Aquí es lo que he intentado hasta ahora:

  • Verificado la configuración de generación, tales como la Plataforma de Destino son todos de la misma (x86).
  • Utilizado peverify con la opción /verbose para asegurar la asamblea binarios eran válidas.
  • Utiliza fuslogvw para buscar cualquier carga de problemas.
  • Utilizado CheckAsm para buscar los archivos que faltan o assembiles.

Todos estos controles no cambiar nada. He incluido el texto completo de la información de la excepción a continuación, con algunos de los nombres cambiados para proteger los secretos de mis maestros corporativos.

Sistema.BadImageFormatException fue no controlada 
Mensaje=no se Pudo cargar el archivo o ensamblado 'XxxDevices, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null' o una de sus dependencias. Se hizo un intento de cargar un programa con un formato incorrecto. 
Fuente=XxxDevicesService 
Nombre de archivo=XxxDevices, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null 
FusionLog=Asamblea administrador de carga de: C:\Windows\Microsoft.NET\Framework64\v4.0.30319\clr.dll 
En ejecución en el archivo ejecutable c:\Dev\TeamE\bin\Release\XxxDevicesService.vshost.exe 
--- Un detallado registro de error de la siguiente manera. 

=== Pre-enlazar la información de estado === 
REGISTRO: Usuario = XXX 
REGISTRO: DisplayName = XxxDevices, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null 
(Totalmente especificado) 
REGISTRO: Appbase = file:///c:/Dev/TeamE/bin/Release/
REGISTRO: Inicial PrivatePath = NULL 
Llamamiento de la asamblea : XxxDevicesService, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null. 
=== 
REGISTRO: Este enlace se inicia en defecto de carga de contexto. 
REGISTRO: Uso del archivo de configuración de aplicación: c:\TeamE\bin\Release\XxxDevicesService.vshost.exe.Config 
REGISTRO: Uso del archivo de configuración de host: 
REGISTRO: Uso del archivo de configuración de máquina de C:\Windows\Microsoft.NET\Framework64\v4.0.30319\config\machine.config. 
REGISTRO: la Política no se aplica para hacer referencia en este momento (privado, personalizado, parcial, o basados en la ubicación de montaje se unen). 
REGISTRO: Intentar descargar de nuevo URL file:///c:/TeamE/bin/Release/XxxDevices.DLL. 
ERROR: no se pudo completar la instalación de la asamblea (hr = 0x8007000b). Sondeo terminado. 

StackTrace: 
en XxxDevicesService.Programa.Main(String[] args) 
en el Sistema.Dominio de aplicación._nExecuteAssembly(RuntimeAssembly asamblea, String[] args) 
en Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly() 
en el Sistema.Las operaciones de roscado.ExecutionContext.Ejecutar(ExecutionContext executionContext, devolución de llamada ContextCallback, el estado del Objeto, Boolean ignoreSyncCtx) 
en el Sistema.Las operaciones de roscado.ExecutionContext.Ejecutar(ExecutionContext executionContext, devolución de llamada ContextCallback, el estado del Objeto) 
en el Sistema.Las operaciones de roscado.ThreadHelper.ThreadStart() 
InnerException: 
  • ¿Qué es xxxDevices?
  • eres la mezcla de código nativo / .net a todos?
  • Usted está en la derecha la pista que esta excepción se asocia con x86/x64 bits diferencias. Supongo que esto no es una aplicación web a la derecha? También, ¿qué tipo de reunión es XxxDevicesService? Es compilado para una plataforma específica (por ejemplo, 32 bits)? Si es así, entonces usted debe compilar su plataforma de 32 bits.
  • support.microsoft.com/en-us/kb/967163
InformationsquelleAutor | 2012-01-25

18 Comentarios

  1. 116

    Verificado la configuración de generación, tales como la Plataforma de Destino son todos de la misma (x86).

    Que no es lo que el registro de bloqueo dice:

    Asamblea administrador de carga de: C:\Windows\Microsoft.NET\Framework64

    Nota la 64 en el nombre, que es el hogar de la versión de 64 bits del marco. Establecer el Objetivo de la plataforma de configuración en su EXE proyecto, no su proyecto de biblioteca de clases. El XxxDevicesService proyecto EXE determina el valor de bits del proceso.

    • Y mientras que usted está comprobando el proyecto EXE – verificación tanto de Depuración y de la Liberación. :/
  2. 36

    Después de que dejé de golpear mi cabeza sobre el escritorio pensando toda la semana he pasado corriendo por este problema, estoy compartiendo lo que funcionó para mí. Tengo Win7 64 bits, 32 bits del Cliente de Oracle, y tener mi MVC 5 conjunto de proyectos a ejecutar en la plataforma x86, porque de Oracle bits. Yo seguía recibiendo los mismos errores:

    No se pudo cargar el archivo o ensamblado ‘Oracle.DataAccess’ o uno de sus
    las dependencias. Se hizo un intento de cargar un programa con una incorrecta
    formato.

    Me vuelve a cargar los paquetes de NuGet, he utilizado las copias de los archivos Dll que funcionado para otras personas en diferentes aplicaciones, me puse el código en el dependiente de la asamblea para que apunte a mi carpeta bin del proyecto, traté de CopyLocal como verdadera o falsa, traté de todo.
    Finalmente tuve suficiente del resto de las cosas quería ver en mi código, y como un nuevo contratista no tengo la subversión de configurar. Mientras buscaba una manera de conectar a VS, me tropezar con la respuesta.
    Lo que he encontrado que funcionó fue desmarcando la opción «Usar la versión de 64 bits de IIS Express para Sitios Web y Proyectos, bajo la opción de Proyectos y Soluciones => Web de la sección de Proyectos en Herramientas=>Opciones de menú.

    • Gracias a este solucionado un problema con pdfium para mí!
    • Lo que es un protector de la vida!! Gracias. Para mí, he tenido que comprobar esto, ya que mi proyecto es efectivamente x64. Gracias de nuevo!!!
    • Después de toda la ayuda que he recibido aquí, estoy muy contento de haber sido capaz de pagar parte de adelante!
    • Para aquellos que utilizan IIS Local, asegúrese de que la aplicación de la piscina de «Permitir que las Aplicaciones de 32 Bits» (en Configuración Avanzada) está ajustado en True.
    • Un addenum a @EricEskildsen del comentario anterior acerca de «permitir que las aplicaciones de 32 bits» en la aplicación de la piscina, incluso si usted no quiere hacer eso, en el entorno vivo, voltear el interruptor que puede proporcionar pistas adicionales si se puede son frente a un 32-bit/64-bit problema o algo más.
    • Boom! Que era él.
    • Gracias! El problema es que esto no es un proyecto a nivel de configuración, por lo que cada nuevo desarrollador va a obtener el mismo problema hasta que nos recuerda marcar la casilla
    • Si usted tiene múltiples desarrolladores, han abierto un proyecto en blanco, verificación, y guardar como una plantilla. Luego se puede compartir que como punto de partida para nuevos proyectos en lugar de la que sale de la caja. Otros ajustes se pueden establecer en ese tiempo, y la plantilla compartida con el equipo. Sólo un pensamiento–acabo de regresar de un viaje de 3 horas siguientes 4 horas de entrevista, por lo que no estoy de pruebas de este. Si cada uno de ellos tiene su propia configuración IIS, todavía sólo tiene que comprobar una vez para su local de IIS si se hace de la Aplicación de la Piscina de forma en su lugar. Curiosidad por conocer sus resultados.

  3. 20

    Lo que he encontrado que funcionó fue seleccionando la opción «Usar la versión de 64 bits de IIS Express para Sitios Web y Proyectos, bajo la opción de Proyectos y Soluciones => Web de la sección de Proyectos en Herramientas=>Opciones de menú.

    • GRACIAS!!! He estado luchando con esto de una hora ahora. 🙂
    • tú eres el salvador. +1
    • He reinstalado VS y fue la solución de este problema (gracias a esta solución funcionó). Moraleja de la historia para mí es si sé que yo no había cambiado nada de código para empezar, tal vez debería mirar en la configuración de VS en primer lugar.
    • casilla de verificación «Utilizar la versión de 64 bits de IIS Express para Sitios Web y Proyectos’ es desabled
    • Por favor, dígale a Lucy
  4. 12

    Generalmente puede ocurrir cuando se cambia el marco de destino de .csproj y volvió de nuevo a lo que empezó.

    Asegúrese de que 1 si supportedRuntime version=»un diferente tiempo de ejecución de la cs objetivo del proyecto» bajo la etiqueta de inicio de la aplicación.config.

    Asegúrese de 2 Que también significa la comprobación de otros autogenerado o otros archivos pueden ser propiedades de la carpeta para ver si no hay más tiempo de ejecución de desajuste entre estos archivos y que se define en .archivo csproj.

    Estos sólo podría ahorrar mucho tiempo antes de empezar a probar cosas diferentes con las propiedades del proyecto para superar el error.

    • Me encontré con un problema similar y su respuesta fue la solución para la mía. Mi aplicación.config había diferentes apoyado en tiempo de ejecución.
    • #1 trabajó para mí, gracias!
  5. 8

    Tuve el mismo problema aunque tengo el de 64 bits de Windows 7 y yo se carga una DLL de 64 bits b/c en las propiedades del Proyecto | construcción que había «Prefieren 32 bits» marcada. (No sé por qué, que se establece de forma predeterminada). Una vez me desenfrenado que, todo corrió fina

    • Mismo aquí. Este hizo el truco. Hace referencia a un ensamblado de 64 bits y el activo de configuración de compilación se establece para Cualquier CPU, pero debido a este «prefieren 32 bits» configuración de assumably de 32 bits se utilizó la ejecución de la aplicación y causó los problemas.
    • Recogido CPU en lugar de x86 en el modo de Depuración y trabajó como un encanto.
  6. 7

    También se puede obtener esta excepción cuando la aplicación de destino .NET Framework 4.5 (por ejemplo) y que tiene la siguiente aplicación.config :

    <?xml version="1.0" encoding="utf-8"?>
    <configuration>
      <startup>
        <supportedRuntime version="v2.0.50727" />
        <supportedRuntime version="v4.0" />
      </startup>
    </configuration>

    Al intentar iniciar la depuración de la aplicación obtendrá la BadImageFormatException.

    La eliminación de la línea de declarar la v2.0 versión para borrar el error.

    Tuve este problema hace poco, cuando traté de cambiar el destino de la plataforma de un viejo .NET 2.0 proyecto .NET 4.5.

  7. 5

    Fondo

    Comenzamos este día de hoy, cuando cambiamos nuestro servicio WCF de AnyCPU para x64 en un Windows 2012 R2 servidor que ejecuta IIS 6.2.

    Primero revisamos la única referencia de ensamblado 10 veces, para asegurarse de que no era en realidad un dll x86. Siguiente se verificó la aplicación de la piscina muchas veces para asegurarte de que no era la habilitación de 32 bits de las aplicaciones.

    En un capricho, he intentado cambiar la configuración. Resulta que los grupos de aplicaciones en IIS fueron el uso de un Habilitar Aplicaciones de 32 Bits valor de Falso, pero IIS estaba ignorando en nuestro servidor, por alguna razón, y siempre corrió de nuestro servicio en x86 modo.

    Solución

    • Seleccione la aplicación de la piscina.
    • Elegir Conjunto de la Aplicación de valores Predeterminados de grupo… o Configuración Avanzada….
    • Cambio Habilitar Aplicaciones de 32 Bits a la Verdad.
    • Haga clic en ACEPTAR.
    • Elegir Conjunto de la Aplicación de valores Predeterminados de grupo… o Configuración Avanzada… de nuevo.
    • Cambio Habilitar Aplicaciones de 32 Bits a False.
    • Haga clic en ACEPTAR.
  8. 4

    He arreglado este problema cambiando la web de la aplicación para que use otro grupo de Aplicaciones»».

  9. 4

    Para cualquier persona que pueda llegar aquí en un momento posterior….Nada funcionó para mí. Todos mis asambleas estaban bien. Tuve una aplicación de configuración en uno de mis Proyectos de Visual Studio que no debería haber estado allí. Para asegurarse de que su aplicación archivo de configuración es necesario.

    He eliminado el extra de la aplicación de configuración y funcionó.

    • Fijo para mí. Mi Aplicación.config fue la creación de mi .NET 4.5.1 aplicación para el CLR 2.0!
  10. 2

    Determinar el grupo de aplicaciones utilizadas por la aplicación y establezca la propiedad de configuración Habilitar aplicaciones de 32 bits a la Verdad. Esto se puede hacer a través de la configuración avanzada de la aplicación de la piscina.

  11. 2

    Cuando la creación de aplicaciones de 32 bits o de 64 bits (Mi experiencia es con Visual Studio 2010), no confían en el Administrador de Configuración para establecer la plataforma correcta para el archivo ejecutable. Incluso si el CM ha x86 seleccionados para la aplicación, compruebe las propiedades del proyecto (ficha de Compilación): se podría decir «la CPU» allí. Y si se ejecuta un «CPU» ejecutable en una plataforma de 64 bits, se ejecutará en modo de 64 bits y se niegan a cargar el acompañamiento de los archivos Dll que se construyeron para la plataforma x86.

  12. 1

    Eliminar su dependencia en el Sistema.Tiempo de ejecución en su Web.Config, que trabajó para mí:

    <dependentAssembly>
            <assemblyIdentity name="System.Runtime" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
            <bindingRedirect oldVersion="0.0.0.0-4.0.10.0" newVersion="4.0.10.0" />
    </dependentAssembly>
    • Para mí fue el System.Net.Http. Gracias por ello.
  13. 1

    Para .NET Core, hay un Visual Studio 2017 error que pueden causar las propiedades del proyecto Construir la página para mostrar la incorrecta plataforma de destino. Una vez que se descubre que el problema es que las soluciones son bastante fáciles. Usted puede cambiar el destino a algún otro valor y, a continuación, volver a cambiarlo.

    Alternativamente, usted puede agregar un tiempo de ejecución de identificador .csproj. Si usted necesita que su .exe para ejecutar como x86 para que pueda cargar un x86 DLL nativa, añadir este elemento dentro de un PropertyGroup:

    <RuntimeIdentifier>win-x86</RuntimeIdentifier>

    Un buen lugar para poner esto es justo después de la TargetFramework o TargetFrameworks elemento.

  14. 1

    Me sorprende que nadie haya mencionado esto lo estoy compartiendo en caso de que ninguno de los de arriba ayuda (mi caso).

    Lo que estaba sucediendo era que un VBCSCompiler.exe instancia de alguna manera estaba atascado y de hecho no era la liberación de los identificadores de archivo para permitir la creación de nuevas instancias para escribir correctamente los archivos nuevos y que estaba causando el problema. Esto se hizo evidente cuando traté de borrar el directorio «bin» y se quejaba de que otro proceso fue con los archivos de allí.

    Cerrada VS, abre el administrador de tareas, miró y terminados todos los VBCSCompiler instancias y borrar el directorio «bin» para volver a donde estaba.

    Referencia: https://developercommunity.visualstudio.com/content/problem/117596/vbcscompilerexe-process-stays-runing-after-exiting.html

    • Mi solución fue eliminar todos los de la papelera de reciclaje y depuración de directorios.
  15. 1

    Objetivo de construir x64
    Objetivo de Alojamiento de Servidor IIS de 64 Bits

    Si la generación de aplicaciones es la orientación de sistema operativo de 64 Bits, a continuación, en el servidor de 64 Bits hosting el IIS,Establezca la opción habilitar la aplicación de 32 bits en el grupo de aplicación que ejecuta el sitio web/aplicación web falsa.

    Solución De Problemas BadImageFormatException

  16. 0

    Para cualquier persona que pueda llegar aquí en un momento posterior…

    Para la solución de Escritorio tengo BadImageFormatException excepción.

    El proyecto de construir opciones estaba muy bien (todos x86). Pero el proyecto de Inicio de la solución fue cambiado a algún otro proyecto(proyecto de biblioteca de clases).

    El cambio de proyecto de Inicio a la original.exe de la aplicación del proyecto) fue una solución en mi caso

  17. 0

    Cuando me enfrenté a este problema de la siguiente resuelto por mí:

    Me estaba llamando un OpenCV dll desde adentro de otro exe, mi dll no contenía el ya necesario opencv archivos dll como highgui, features2d, y etc disponibles en la carpeta de mi archivo exe. He copiado todos estos en el directorio de mi proyecto exe y de repente se trabajó.

  18. 0

    Este error «no se Pudo cargar el archivo o ensamblado ‘ejemplo’ ni una de sus dependencias. Se hizo un intento de cargar un programa con un formato incorrecto» normalmente es causada por una incorrecta configuración del grupo de aplicaciones.

    1. Asegurarse de que el AppPool su sitio se está ejecutando actualmente en ha «Permitir que las Aplicaciones de 32 Bits» se establece en False.
    2. Asegurarse de que está utilizando la versión correcta para su plataforma.
    3. Si usted está recibiendo este error en un sitio web, asegúrese de que su grupo de aplicaciones está configurado para ejecutarse en el modo correcto (3.0 sitios deben ejecutar en el modo de 64 bits)
    4. También debe asegurarse de que la referencia a la asamblea en visual studio está apuntando al archivo correcto en la carpeta de paquetes.
    5. Asegurarse de que tiene la versión correcta del archivo dll instalado en el GAC para sitios 2.0.
    6. Esto también puede ser causado por WSODLibs de ser promovido con el proyecto web.

Dejar respuesta

Please enter your comment!
Please enter your name here