System.BadImageFormatException: no se pudo cargar el archivo o ensamblado (desde installutil.exe)

104

Estoy intentando instalar un servicio de Windows usando InstallUtil.exe y aparece el mensaje de error

System.BadImageFormatException: no se pudo cargar el archivo o ensamblado ' {xxx.exe}' o una de sus dependencias. Se intentó cargar un programa con un formato incorrecto.

¿Lo que da?


EDITAR: (No por OP) Mensaje completo extraído de dup obteniendo muchas más visitas [para la capacidad de Google]:

C: \ Windows \ Microsoft.NET \ Framework64 \ v4.0.30319> InstallUtil.exe C: \ xxx.exe Utilidad de instalación de Microsoft (R) .NET Framework Versión 4.0.30319.1 Copyright (c) Microsoft Corporation. Todos los derechos reservados.

Se produjo una excepción al inicializar la instalación: System.BadImageFormatException: No se pudo cargar el archivo o ensamblado 'file: /// C: \ xxx.exe' o una de sus dependencias. Se intentó cargar un programa con un formato incorrecto.

Epaga
fuente

Respuestas:

154

Algunos detalles más para completar en caso de que ayude a alguien ...

Tenga en cuenta que la razón más común para esta excepción en estos días es intentar cargar una /platform:x86DLL ( ) específica de 32 bits en un proceso que es de 64 bits o viceversa (es decir, cargar una /platform:x64DLL ( ) específica de 64 bits en un proceso que es 32 bits). Si su platformno es específico ( /platform:AnyCpu), esto no surgirá (asumiendo que ninguna dependencia referenciada tiene el bitness incorrecto).

En otras palabras, ejecutar:

% windir% \ Microsoft.NET \ Framework \ v2.0.50727 \ installutil.exe

o:

% windir% \ Microsoft.NET \ Framework 64 \ v2.0.50727 \ installutil.exe

no funcionará (sustitúyalo en otras versiones del marco: v1.1.4322(solo 32 bits, para que este problema no surja) y v4.0.30319como se desea en lo anterior).

Obviamente, como se explica en la otra respuesta, también se necesitará que el número de versión .NET del installutilque está ejecutando sea> = (preferiblemente =) el del archivo EXE / DLL del que está ejecutando el instalador.

Finalmente, tenga en cuenta que en Visual Studio 2010, las herramientas generarán de forma predeterminada binarios x86 (en lugar de cualquier CPU como antes ).

Detalles completos de System.BadImageFormatException (decir que la única causa es una falta de coincidencia de bits es realmente una simplificación excesiva).

Otra razón para un instalador BadImageFormatExceptioninferior a x64 es que en Visual Studio 2010, el .vdprojtipo de proyecto de instalación predeterminado genera una InstallUtilLibcorrección de 32 bits , incluso en un sistema x64 (la búsqueda de "acciones personalizadas administradas de 64 bits arroja una excepción System.BadImageFormatException" en la página).

Ruben Bartelink
fuente
Tuve el mismo problema, cuando comencé a depurar de acuerdo con lo que dijiste anteriormente, encontré que Platform: estaba configurado como x86. Cuando lo cambié a Cualquier CPU, funcionó :)
Atta H.
Tengo mi instalador de Windows con acciones personalizadas. Mi configuración debe ejecutarse en un sistema x64, por lo que las propiedades de acciones personalizadas deben marcar la opción "Run64Bit" en verdadero. Resolvió mi problema.
Hagen
9

Creo que está utilizando la versión de 64 bits de la herramienta para instalar una aplicación de 32 bits. También me enfrenté a este problema hoy y utilicé esta ruta de Framework para atender.

C: \ Windows \ Microsoft.NET \ Framework \ v4.0.30319

y debería instalar su aplicación de 32 bits sin problemas.

Sachin Kalia
fuente
Ese fue el escenario para mí. Respuesta muy útil.
Simos Fasouliotis
Al menos vincule la respuesta original: stackoverflow.com/revisions/5229405/1
crusy
8

La clave es establecer la configuración del procesador de coincidencia para el proyecto, que se encuentra en dos lugares.

ingrese la descripción de la imagen aquí

Y también asegúrese de que la configuración de la arquitectura sea la misma en el menú Prueba >> Configuración de prueba >> Arquitectura de procesador predeterminada >> como se muestra a continuación.

ingrese la descripción de la imagen aquí

Esto es para VS2013 pero quizás lo mismo para otras versiones también.

Actualización - Para VS2019:

ingrese la descripción de la imagen aquí

zar
fuente
Esta es la forma correcta de corregir este error. Es decir, si no quiere perder el tiempo con posiblemente cientos de archivos csproj.
Bizhan
6

OK, este es el problema que tuve y, lo que lo solucionó, parece muy relevante para lo anterior.

Estoy usando Visual Studio 2010 Express. Escribí un servicio de prueba que realmente no hizo nada. Fue solo práctica para lo real más tarde.

Escribí el servicio e intenté instalarlo usando installutil.exey obtuve el siguiente error:

System.BadImageFormatException: no se pudo cargar el archivo o ensamblado '{filename.exe}' o una de sus dependencias. Se intentó cargar un programa con un formato incorrecto.

Hasta aquí lo mismo que el autor original.

La observación de Ruben anterior sobre la salida de 32 bits de Visual Studio 2010 fue la salvadora aquí.

Usé la versión de 64 bits del installutil.exey, efectivamente, el resultado de la compilación de Visual Studio 2010 fue de 32 bits. Solo para agregar un poco de valor adicional aquí, puede encontrar la versión de 32 bits del último marco .NET y el asociado installutil.exeen la carpeta C: \ Windows \ Microsoft.NET \ framework . Usando esta versión del installutil.exesolucionado mi problema; el servicio instalado sin problemas!

Espero que esto ayude a alguien más.

James Crowther
fuente
No sé qué quieres decir con la versión de 32 bits, pero probé la de aquí y tampoco funcionó C: \ Windows \ Microsoft.NET \ Framework \ v2.0.50727
user2568374
3

Después de probar todas las soluciones mencionadas, encontré el PlatformTargetagregado de alguna manera a la AnyCPUconfiguración en mi proyecto .csproj.

<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
    <DebugType>pdbonly</DebugType>
    <Optimize>true</Optimize>
    <OutputPath>bin\Release\</OutputPath>
    <DefineConstants>TRACE</DefineConstants>
    <ErrorReport>prompt</ErrorReport>
    <WarningLevel>4</WarningLevel>
    <PlatformTarget>x64</PlatformTarget>
</PropertyGroup>

Eliminar la línea funcionó para mí.

SohamC
fuente
En mi caso, donde quiero una compilación de 64 bits, a uno de los nodos PropertyGroup le faltaba el nodo <PlatformTarget> x64 </PlatformTarget>, por lo que presumiblemente estaba predeterminado en 32 bits y arrojaba el error de formato de imagen incorrecta. Una vez que agregué este nodo faltante al grupo de propiedades, el error desapareció.
Tom Regan
Probar esta solución me provocó otro problema, que era que appSettings de app.config no se cargaba durante el tiempo de ejecución a pesar de que el archivo de configuración estaba presente en el directorio de salida . sin embargo, después de probar el enfoque de zar ( Processor Architecture for AnyCPU Projects), todo vuelve a funcionar.
Bizhan
1

Tuve este problema con un proyecto WinForms usando VS 2015. Mi solución fue:

  1. haga clic derecho en el Proyecto
  2. seleccionar propiedades
  3. marque "Preferir 32 bits"
  4. Objetivo de la plataforma: cualquier CPU
Michael Staples
fuente
0

Tuve el mismo problema. Utilizo el comando estándar para la ejecución. Estaba llamando al X64 ro ejecutar contra las pruebas de X86. Necesitaba especificar el X86 y no la versión X64 del nunit-runner.

dermot kirk
fuente
0

En resumen, tanto Build como Project \ Build \ Platform deben configurarse en x64 para poder instalar con éxito el servicio de 64 bits en un sistema de 64 bits.

Daniel D
fuente
0

Mi problema fue diferente. Esto ocurrió después de un apagado inesperado de mi máquina con Windows 7. Realicé una solución limpia y funcionó como se esperaba.

GregN
fuente
0

En el caso de tener este mensaje en pruebas en vivo , pero no en pruebas unitarias , es porque los ensamblajes seleccionados se copian sobre la marcha en $(SolutionDir)\.vs\$(SolutionName)\lut\0\0\x64\Debug\. Pero en algún momento no se pueden seleccionar algunos ensamblados , por ejemplo, dlls de VC ++ en el caso de proyectos de interoperabilidad c ++ / c #.

La compilación posterior xcopyno corregirá el problema, porque el motor de prueba en vivo borrará el archivo copiado.

La única solución alternativa hasta la fecha (28 de diciembre de 2018) es evitar las pruebas en vivo y hacer todo en pruebas unitarias con el atributo [TestCategory("SkipWhenLiveUnitTesting")]aplicado a la clase de prueba o al método de prueba.

Este error se ve en cualquier Visual Studio 2017 hasta 15.9.4 y debe ser abordado por el equipo de Visual Studio.

Soleil - Mathieu Prévot
fuente
0

Compilación de destino Servidor de destino x64 Alojamiento IIS de 64 bits

Haga clic con el botón derecho en el alojamiento de appPool que ejecuta el sitio web / aplicación web y configure la habilitación de la aplicación de 32 bits = false.

ingrese la descripción de la imagen aquí

VK_217
fuente
0

Hoy me he enfrentado a este problema. En mi caso, el destino de la plataforma de mi aplicación (tenía una referencia a un dll de 64 bits) estaba configurado en, AnyCPUpero la Prefer 32-bit casilla de verificación en la sección de destino de la plataforma estaba marcada de forma predeterminada. Este era el problema y funcionó bien después de desmarcar la Prefer 32-bitopción.

ceniza
fuente
0

Encontramos una solución diferente a un problema con el mismo síntoma:

Vimos este error cuando actualizamos el proyecto de .net 4.7.1 a 4.7.2.

El problema era que a pesar de que ya no hacíamos referencia a System.Net.Http en el proyecto, estaba incluido en la sección Dedependiente de ensamblado de nuestro web.config. La eliminación de esta y cualquier otra referencia de ensamblado no utilizada del web.config resolvió el problema.

Logan
fuente
0

El problema es que todos, System.BadImageFormatException: Could not load file or assemblyincluidos los que no están asociados installutil.exeen absoluto, apuntan a este mismo hilo.

  1. Si su problema está relacionado con WindowsBaseo PresentationFramework dlls y tiene analizadores instalados, asegúrese de tenerlos instalados para todos los proyectos de su solución o para ninguno de ellos.

    ingrese la descripción de la imagen aquí

  2. Haga referencia a todo el marco en el .csprojarchivo de su biblioteca en lugar de solo a los dos dlls:

    <Project Sdk="Microsoft.NET.Sdk.WindowsDesktop">
    
      <PropertyGroup>
        <OutputType>Library</OutputType>
        <TargetFramework>netcoreapp3.0</TargetFramework>
        <RazorLangVersion>3.0</RazorLangVersion>
        <UseWpf>True</UseWpf>
      </PropertyGroup>
  3. Eliminar biny objdirs, limpiar la solución y reconstruir.

rvnlord
fuente