"È stato effettuato un tentativo di caricare un programma con un formato errato" anche quando le piattaforme sono uguali


461

Sto chiamando funzioni da una DLL non gestita a 32 bit su un sistema a 64 bit. Quello che ottengo è:

BadImageFormatException: è stato effettuato un tentativo di caricare un programma con un formato errato. (Eccezione da HRESULT: 0x8007000B)

Inizialmente, i miei progetti erano impostati sulla piattaforma Any CPU, quindi li ho cambiati entrambi in x86, ma l'errore si sta ancora verificando. Questa è davvero l'unica soluzione che conosco per questo.

Le DLL non sono corrotte o altro, perché posso usarle con altri programmi (di cui non ho la fonte). Ho pensato che forse non stava trovando una dipendenza, ma ho controllato e sono tutti lì. Inoltre, DllNotFoundExceptionin questo caso non lo lancerebbe ?

Cos'altro posso fare? E prima di dire "Usa invece una DLL non gestita a 64 bit", lasciami sottolineare che non ce n'è una. ;)


1
Quali progetti hai cambiato in x86? E come eseguirli quando si ottiene l'eccezione, tramite il debugger o manualmente? In quest'ultimo caso, hai notato che quando sei passato a x86, hai ottenuto una nuova cartella nella directory bin \? In pratica ora è bin \ x86 \ Debug per i file.
Lasse V. Karlsen,

È possibile verificare che l'eseguibile sia in esecuzione in modalità 32 bit (* 32 nel gestore processi)?
JP Alioto,

@Lasse V. Karlsen: Sì, ho rimosso il bit x86 dal percorso di output quando ho cambiato la piattaforma in ciascun progetto. Il mio primo progetto è una DLL che racchiude le funzioni nella DLL non gestita. Il secondo progetto è un eseguibile che utilizza il wrapper nella prima DLL. Entrambi sono impostati su x86.
David Brown,

@JP: In realtà, il gestore processi non mostra che sia in esecuzione come processo a 32 bit. Perché?
David Brown,

Risposte:


532

Se si tenta di eseguire applicazioni a 32 bit su IIS 7 (e / o computer con sistema operativo a 64 bit), si otterrà lo stesso errore. Quindi, da IIS 7, fai clic con il pulsante destro del mouse sul pool di applicazioni delle applicazioni e vai su "Impostazioni avanzate" e modifica "Abilita applicazioni a 32 bit" su "VERO".

Riavvia il tuo sito Web e dovrebbe funzionare.

inserisci qui la descrizione dell'immagine


1
Oh, i miei giorni ho cercato di installare componenti IIS extra quando questa era la risposta ... Qualcuno può suggerire un aspetto negativo di avere questa opzione selezionata?
notidaho,

3
Ecco una buona discussione sulla questione delle prestazioni in merito a questo: stackoverflow.com/questions/507820/…
Ben Power,

Ho un problema con SharpSvn e questo non aiuta. :( Sth è molto sbagliato in questo assembly, ti dico ...
user2173353

4
Questa risposta è una risposta per me, perché la domanda non menziona affatto IIS!
kristianp

129

In qualche modo, il casella di controllo Build in Configuration Manager era deselezionata per il mio eseguibile, quindi era ancora in esecuzione con la vecchia build Any CPU. Dopo averlo risolto, Visual Studio si è lamentato del fatto che non è stato possibile eseguire il debug dell'assembly, ma che è stato risolto con un riavvio.


Molte grazie. Anche questo mi ha preso. Build verificato in Configuration Manager e ora funziona (applicazione desktop WPF).
danglund,

1
Se hai fatto tutto quanto sopra e verificato le impostazioni della tua piattaforma, crea le impostazioni di configurazione, ripulito la soluzione e non funziona ancora, cerca tutte le istanze della DLL ed eliminale.
Will Calderwood,

con VS 2015 questo è ancora valido - anche se non ho dovuto riavviare :)
increddibelly il

Questo è tutto! Rivedere le impostazioni di Configuration Manager è la risposta.
AndyUK,

74

In Visual Studio , fai clic con il pulsante destro del mouse sul progetto -> Nel riquadro sinistro fai clic sulla scheda Genera ,

Proprietà del progetto, scheda Costruisci

in Target piattaforma selezionare x86 (o più in generale l' architettura da abbinare alla libreria a cui ci si collega)

Proprietà del progetto, target della piattaforma

Spero che questo aiuti qualcuno! :)


2
Questo risolto il mio problema in VS2013, ho trovato una soluzione alternativa è quella di lasciare "Target piattaforma" come "Qualsiasi CPU" ma selezionare la casella di controllo "Prefer 32-bit".
user1069816,

2
Sebbene sia necessario utilizzare .NET 4.5 o versioni successive per poter selezionare la casella di controllo "Prefer 32 bit"
user1069816

1
Sì, ma ho convertito il mio progetto in "Qualsiasi CPU" in "x64". Il mio progetto a 32 bit funziona bene ma lo stesso codice che ho convertito in 64 bit, quel progetto non funziona bene come 32 bit. Potete per favore darmi il giusto processo di conversione a 64 bit ...
Ismayil S

@IsmayilS assicurati di utilizzare una versione a 64 bit della libreria a cui stai collegando
Marvin Thobejane,

53

Ho avuto anche questo problema. Ho provato tutti i suggerimenti qui, ma non hanno aiutato.

Ho trovato un'altra cosa da verificare che l'ha risolto per me. In Visual Studio, fai clic con il pulsante destro del mouse sul progetto e apri "Proprietà". Fai clic sulla scheda "Compila" (o "Crea"), quindi fai clic su "Opzioni di compilazione avanzate" nella parte inferiore.

Controllare il menu a discesa "CPU di destinazione". Dovrebbe corrispondere alla "Piattaforma" che stai costruendo. Cioè, se stai costruendo "Any CPU", allora "Target CPU" dovrebbe dire "Any CPU". Esamina tutte le tue piattaforme rendendole attive e controlla questa impostazione.


2
E per quelli di noi che utilizzavano solo il compilatore, la mia soluzione era aggiungere "/ platform: x86" ai flag del compilatore.
Urchin,

Questo ha risolto anche per me. Ho dovuto regolare il "target della piattaforma" nella scheda "Build".
Jowen,

se sei su 64 bit, controlla anche il flag "prefer 32 bit". Ho dovuto disabilitarlo per me.
N4ppeL

51

Se si verifica questo errore quando si fa clic sul pulsante freccia verde per eseguire l'applicazione, ma si desidera comunque eseguire l'app a 64 bit. Puoi farlo in VS 2013, 2015, 2017 e 2019

Vai a: Strumenti> Opzioni> Progetti e soluzioni> Progetti Web> Usa la versione a 64 bit di IIS Express


3
Grazie. Ne ho provati tanti e niente mi ha aiutato. Sei il mio salvavita. Ho un sistema operativo a 64 bit, installato Visual Studio a 64 bit [che funziona ancora a 32 bit per motivi sconosciuti]. Quando ho messo il mio Platform Target su x64, stava generando un errore BadImageFormatException. Con la tua correzione, ha funzionato. Ti ho dato un voto.
Fai

Sono felice di poterti aiutare :)
Paibamboo

Questa è la risposta di cui ho bisogno. Molte grazie!
yushulx

Grazie mille, questo ha risolto il problema. Funziona bene con il processo a 32 bit di Visual Studio 2017.
samir105

1
funziona ancora con VS 2019, grazie
Jake Gaston

36

Se si utilizza Any CPU , è possibile che si verifichi questo problema se l' opzione Prefer 32 bit è selezionata:

Assicurati di deselezionare questa opzione nella scheda Costruisci della proprietà del progetto !

inserisci qui la descrizione dell'immagine


3
Sarebbe utile se tu potessi indicare dove in Visual Studio trovare questa opzione.
trysis,

@trysis, questa opzione si trova nella pagina Build del riquadro delle impostazioni del progetto.
Drew Noakes,

1
Stavo dicendo che sarebbe stato utile inserirla. Allo stato attuale di questa risposta, non vi è alcun contesto in cui dire allo sfortunato, forse nuovo utente di StackOverflow, dove trovarlo.
trysis,

Qual è il percorso per ottenere questo modulo? Non riesco a trovarlo
Adolfo Correa,

In Visual Studio, fai clic con il pulsante destro del mouse sul progetto e scegli "Proprietà".
Drew Noakes,

8

Un po 'fuori tema per questo post, ma la ricerca di questo messaggio di errore mi ha portato qui.

Se stai compilando il sistema del team e ricevi questo errore, la scheda del processo di definizione build ha un'impostazione "Piattaforma MSBuild". Se impostato su "Auto", è possibile che si verifichi questo problema. Modificandolo in "X86" è anche possibile risolvere l'errore.


questa è la risposta più vicina a ciò che stavo vivendo. Avevo una DLL che doveva essere x86. L'ho usato in un altro progetto, che era AnyCPU per impostazione predefinita. Devono solo abbinare. In questo caso, non ha fatto molta differenza, quindi ho cambiato il nuovo progetto in x86.
Greg

8

Nel mio caso stavo usando una DLL nativa in C #. Questa DLL dipendeva da un paio di altre DLL mancanti. Una volta aggiunte quelle altre DLL, tutto ha funzionato.


4

Basandosi sulla risposta di @paibamboo

Ha detto: Vai su: Strumenti> Opzioni> Progetti e soluzioni> Progetti Web> Usa la versione a 64 bit di IIS Express

Il mio collega aveva selezionato questa casella (la cercava esplicitamente), ma aveva il messaggio di errore in questione. Dopo alcune ore deselezionò la casella e la ricontrollò. Ecco ed ecco: il codice ora funzionava con successo.

Sembra che ci siano due posti in cui viene salvato lo stato di questo riquadro che è diventato non sincronizzato. Deselezionandolo e ricontrollandolo è stato nuovamente sincronizzato.

Domanda per utenti più competenti: c'è stato un aggiornamento o qualcosa della scorsa settimana (per VS 2015) che ha sincronizzato gli stati?


3

Vedi anche questa risposta , che ha risolto lo stesso problema per me.

Postato da Luis Mack il 5/12/2010 alle 8:50 Ho riscontrato lo stesso problema, solo per un progetto specifico durante la compilazione su una macchina a 64 bit. Una correzione per far funzionare SEEMS consiste nel modificare manualmente un carattere nel flusso di immagini OGNI VOLTA il controllo utente o il modulo vengono modificati nel designer

 AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj00LjAuMC4w

Cambia in

 AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj0yLjAuMC4w

Questo è 00LjAuMC4w di nuovo a 0yLjAuMC4w alla fine della riga (da 00 a 0y)


1
Un breve riassunto del link sarebbe utile @Shaul :)
Marvin Thobejane,

Magnifico. Grazie, il briefing aggiunge contenuto al tuo commento
Marvin Thobejane,

2

Nel mio caso, sto usando un piccolo .exe che ricarica le DLL di riferimento tramite Reflection. Quindi faccio solo questi passaggi che mi salvano la giornata:

Dalle proprietà del progetto in Esplora soluzioni, nella scheda build, scelgo target platfrom x86


2

Nel mio caso, stavo eseguendo dei test tramite MSTest e ho scoperto che stavo distribuendo una directory DLL a 32 e 64 bit nella directory di test. Il programma favoriva la DLL a 64 bit e la faceva fallire.

TL; DR Assicurarsi di distribuire solo DLL a 32 bit nei test.


2

Abbiamo riscontrato un problema simile e siamo riusciti a risolverlo impostando Target piattaforma su x86. Proprietà del progetto-> build


Quindi le dll x86 sono diverse da x64? C'è un modo per rilevarlo su un file dll di riferimento?
NoBugs

@NoBugs Sembra che tu possa. Dai un'occhiata a questa discussione
Joe

1

Ho risolto questo problema nel modo "Windows". Dopo aver controllato tutte le mie impostazioni, pulito la soluzione e ricostruita, ho semplicemente chiuso la soluzione e riaperta. Quindi ha funzionato, quindi VS probabilmente non si è sbarazzato di alcune cose durante la pulizia. Quando le soluzioni logiche non funzionano, di solito mi rivolgo a soluzioni illogiche (o apparentemente illogiche). Windows non mi delude. :)


1

Sono stato in grado di risolvere questo problema abbinando la mia versione di build alla versione .NET sul server.

Ho fatto doppio clic su .exe solo per vedere cosa sarebbe successo e mi ha detto di installare 4.5 ....

Quindi ho eseguito il downgrade a 4.0 e ha funzionato!

Quindi assicurati che le tue versioni corrispondano. Funzionava bene sulla mia scatola di sviluppo, ma il server aveva una versione .NET precedente.


1

Nel mio caso il contenuto del file era errato. La DLL è stata scaricata dal web, ma il contenuto della DLL era una pagina HTML: D Prova a verificare se si tratta di un file binario, se sembra che la DLL sia corretta :)


1

Stavamo riscontrando lo stesso problema in .NET core. La soluzione era scaricare il runtime .netcore a 32 bit e avere il tuo target di progettox86

Nel tuo csprojfile aggiungi

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

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

Questo è stato usato per un computer Windows, dovresti regolare i percorsi e simili per Linux / OSX


0

Se si importa DLL non gestita, utilizzare

CallingConvention = CallingConvention.Cdecl 

nel metodo di importazione DLL.


0

1: Vai a: Strumenti> Opzioni> Progetti e soluzioni> Progetti Web> Usa la versione a 64 bit di IIS Express 2: modifica le impostazioni seguenti per il progetto di servizio web. inserisci qui la descrizione dell'immagine

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.