System.BadImageFormatException: impossibile caricare il file o l'assembly (da installutil.exe)


104

Sto cercando di installare un servizio Windows utilizzando InstallUtil.exe e ricevo il messaggio di errore

System.BadImageFormatException: impossibile caricare il file o l'assembly " {xxx.exe}" o una delle sue dipendenze. Si è tentato di caricare un programma con un formato errato.

Cosa succede?


EDIT: (Non da OP) Messaggio completo estratto da dup che ottiene molti più hit [per googleability]:

C: \ Windows \ Microsoft.NET \ Framework64 \ v4.0.30319> InstallUtil.exe C: \ xxx.exe Utilità di installazione di Microsoft (R) .NET Framework Versione 4.0.30319.1 Copyright (c) Microsoft Corporation. Tutti i diritti riservati.

Si è verificata un'eccezione durante l'inizializzazione dell'installazione: System.BadImageFormatException: Impossibile caricare il file o l'assembly "file: /// C: \ xxx.exe" o una delle sue dipendenze. Si è tentato di caricare un programma con un formato errato.

Risposte:


154

Qualche dettaglio in più per completezza nel caso in cui aiuti qualcuno ...

Si noti che il motivo più comune di questa eccezione in questi giorni è il tentativo di caricare una /platform:x86DLL specifica a 32 bit ( ) in un processo a 64 bit o viceversa (vale a dire caricare una /platform:x64DLL specifica a 64 bit ( ) in un processo che è 32 bit). Se il tuo platformnon è specifico ( /platform:AnyCpu), ciò non si verificherà (supponendo che nessuna dipendenza referenziata sia del bit sbagliato).

In altre parole, in esecuzione:

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

o:

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

non funzionerà (sostituire in altre versioni del framework: v1.1.4322(solo a 32 bit, quindi questo problema non si presenta) e v4.0.30319come desiderato in precedenza).

Ovviamente, come spiegato nell'altra risposta, sarà necessario anche che il numero di versione .NET di installutilche stai eseguendo sia> = (preferibilmente =) quello del file EXE / DLL di cui stai eseguendo il programma di installazione.

Infine, si noti che in Visual Studio 2010, gli strumenti verranno impostati per impostazione predefinita sulla generazione di file binari x86 ( anziché su Qualsiasi CPU come in precedenza ).

Dettagli completi di System.BadImageFormatException (dire che l'unica causa è la mancanza di corrispondenza dei bit è davvero una grossolana semplificazione!).

Un altro motivo per un BadImageFormatExceptionsotto un x64 installatore è che in Visual Studio 2010, il valore di default .vdprojdi installazione tipo di progetto genera un 32 bit InstallUtilLibspessore, anche su un sistema x64 (Ricerca per "azioni personalizzate gestite a 64 bit gettano un'eccezione System.BadImageFormatException" su la pagina).


Ho avuto lo stesso problema, quando ho iniziato il debug in base a quanto detto sopra, ho scoperto che Platform: era impostato come x86. Quando l'ho cambiato in Any CPU, ha funzionato :)
Atta H.

Ho il mio programma di installazione di Windows con azioni personalizzate. La mia configurazione deve essere eseguita su un sistema x64, quindi le proprietà delle azioni personalizzate devono selezionare l'opzione "Run64Bit" in true. Ha risolto il mio problema.
Hagen


9

Penso che tu stia utilizzando la versione a 64 bit dello strumento per installare un'applicazione a 32 bit. Oggi ho anche affrontato questo problema e ho utilizzato questo percorso Framework per soddisfare.

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

e dovrebbe installare correttamente la tua applicazione a 32 bit.


Quello era lo scenario per me. Risposta molto utile.
Simos Fasouliotis

Almeno collegare la risposta originale: stackoverflow.com/revisions/5229405/1
crusy

8

La chiave è impostare la corrispondenza delle impostazioni del processore per il progetto che si trovano in due posizioni.

inserisci qui la descrizione dell'immagine

Inoltre, assicurati che le impostazioni dell'architettura siano le stesse nel menu Test >> Impostazioni di prova >> Architettura del processore predefinita >> come mostrato di seguito.

inserisci qui la descrizione dell'immagine

Questo è per VS2013 ma forse lo stesso anche per altre versioni.

Aggiornamento - Per VS2019:

inserisci qui la descrizione dell'immagine


Questo è il modo corretto per correggere questo errore. Cioè, se non vuoi scherzare con forse centinaia di file csproj.
Bizhan

6

OK, questo è il problema che ho avuto e, ciò che lo ha risolto, sembra molto rilevante per quanto sopra.

Sto usando Visual Studio 2010 Express. Ho scritto un servizio di prova che in realtà non ha fatto nulla. Era solo pratica per la cosa reale dopo.

Ho scritto il servizio e ho provato a installarlo usando installutil.exee ho ricevuto il seguente errore:

System.BadImageFormatException: impossibile caricare il file o l'assembly "{filename.exe}" o una delle sue dipendenze. Si è tentato di caricare un programma con un formato errato.

Finora lo stesso dell'autore originale.

L'osservazione di Ruben sopra sull'output a 32 bit di Visual Studio 2010 è stata il salvatore qui.

Ho usato la versione a 64 bit di installutil.exee, abbastanza sicuro, l'output della build di Visual Studio 2010 era a 32 bit. Solo per aggiungere un piccolo valore in più qui, puoi trovare la versione a 32 bit dell'ultimo framework .NET e l'associato installutil.exenella cartella C: \ Windows \ Microsoft.NET \ framework . Utilizzando questa versione di installutil.exerisolto il mio problema; il servizio installato senza intoppi!

Spero che questo aiuti qualcun altro là fuori.


Non so cosa intendi per versione a 32 bit ma ho provato quella qui e non ha funzionato nemmeno C: \ Windows \ Microsoft.NET \ Framework \ v2.0.50727
user2568374

3

Dopo aver provato tutte le soluzioni menzionate, ho trovato in PlatformTargetqualche modo aggiunto alla AnyCPUconfigurazione nel mio progetto .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>

Rimuovere la linea ha funzionato per me.


Nel mio caso, dove voglio una build a 64 bit, a uno dei nodi PropertyGroup mancava il nodo <PlatformTarget> x64 </PlatformTarget>, quindi presumibilmente era impostato su 32 bit e generava l'errore di formato immagine non valido. Dopo aver aggiunto questo nodo mancante al gruppo di proprietà, l'errore è scomparso.
Tom Regan

Provare questa soluzione ha portato a un altro problema per me, che era appSettings di app.config che non veniva caricato durante il runtime nonostante il file di configurazione fosse presente nella directory di output . tuttavia, dopo aver provato l'approccio di zar ( Processor Architecture for AnyCPU Projects), tutto ricomincia a funzionare.
Bizhan

1

Ho avuto questo problema con un progetto WinForms utilizzando VS 2015. La mia soluzione è stata:

  1. fare clic con il pulsante destro del mouse sul progetto
  2. selezionare le proprietà
  3. seleziona "Preferisci 32 bit"
  4. Target della piattaforma: qualsiasi CPU

0

Ho avuto lo stesso problema. Utilizzo il comando standard per l'esecuzione. Stava chiamando il ro X64 eseguito contro i test X86. Avevo bisogno di specificare la versione X86 e non la versione X64 di nunit-runner.


0

Riassumendo, sia Build che Project \ Build \ Platform devono essere impostati su x64 per installare correttamente il servizio a 64 bit su un sistema a 64 bit.


0

Il mio problema era diverso. Ciò si è verificato dopo un arresto imprevisto della mia macchina Windows 7. Ho eseguito una soluzione pulita e ha funzionato come previsto.


0

Nel caso di avere questo messaggio nei test live , ma non negli unit test , è perché gli assembly selezionati vengono copiati al volo in $(SolutionDir)\.vs\$(SolutionName)\lut\0\0\x64\Debug\. Ma a volte alcuni assembly non possono essere selezionati , ad esempio, dll VC ++ in caso di progetti c ++ / c # di interoperabilità.

La post-compilazione xcopynon risolverà il problema, perché il file copiato verrà cancellato dal motore di test live.

L'unica soluzione alternativa fino ad oggi (28 dicembre 2018) è evitare i test live e fare tutto in unit test con l'attributo [TestCategory("SkipWhenLiveUnitTesting")]applicato alla classe di test o al metodo di test.

Questo bug è stato riscontrato in qualsiasi Visual Studio 2017 fino alla 15.9.4 e deve essere risolto dal team di Visual Studio.


0

Target build x64 Server di destinazione che ospita IIS 64 bit

Fare clic con il pulsante destro del mouse sull'hosting appPool che esegue il sito Web / applicazione Web e impostare l'abilitazione dell'applicazione a 32 bit = false.

inserisci qui la descrizione dell'immagine


0

Oggi ho affrontato questo problema. Nel mio caso, il target della piattaforma della mia applicazione (aveva un riferimento a una dll a 64 bit) era impostato su AnyCPUma la Prefer 32-bit casella di controllo nella sezione target della piattaforma era selezionata per impostazione predefinita. Questo era il problema e funzionava bene dopo aver deselezionato l' Prefer 32-bitopzione.


0

Abbiamo trovato una soluzione diversa a un problema con lo stesso sintomo:

Abbiamo riscontrato questo errore quando abbiamo aggiornato il progetto da .net 4.7.1 a 4.7.2.

Il problema era che, anche se non facevamo più riferimento a System.Net.Http nel progetto, era elencato nella sezione dependantAssembily del nostro web.config. La rimozione di questo e di qualsiasi altro riferimento ad assembly inutilizzato da web.config ha risolto il problema.


0

Il problema è che tutti, System.BadImageFormatException: Could not load file or assemblyinclusi quelli non associati installutil.exea tutti, puntano proprio a questo thread.

  1. Se il tuo problema è correlato a WindowsBaseo PresentationFramework dll e hai installato degli analizzatori, assicurati di averli installati per tutti i progetti nella tua soluzione o per nessuno di essi.

    inserisci qui la descrizione dell'immagine

  2. Fai riferimento all'intero framework nel .csprojfile della tua libreria piuttosto che solo a due dlls:

    <Project Sdk="Microsoft.NET.Sdk.WindowsDesktop">
    
      <PropertyGroup>
        <OutputType>Library</OutputType>
        <TargetFramework>netcoreapp3.0</TargetFramework>
        <RazorLangVersion>3.0</RazorLangVersion>
        <UseWpf>True</UseWpf>
      </PropertyGroup>
  3. Rimuovere bine rimuovere obj, pulire la soluzione e ricostruire.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.