Impossibile caricare il file o l'assembly ... È stato effettuato un tentativo di caricare un programma con un formato errato (System.BadImageFormatException)


409

Ho due progetti ProjectAe ProjectB. ProjectBè un'applicazione console, che dipende da ProjectA. Ieri, tutto funzionava bene, ma improvvisamente oggi quando corro ProjectBottengo questo:

BadImageFormatException non è stata gestita :
impossibile caricare il file o l'assembly 'ProjectA, Version = 1.0.0.0, Culture = neutral, PublicKeyToken = null' o una delle sue dipendenze. Tentativo di caricare un programma con un formato errato.

Entrambi sono solo progetti regolari, senza dipendenze da altri progetti non-Net. Entrambi sono completamente .Net: non esiste un codice nativo e nessun P / Invoke. Ho altri progetti che dipendono ProjectAe funzionano ancora bene.

Cose che ho provato:

  • Assicurati che entrambi i progetti siano impostati su "Qualsiasi CPU" con la casella di controllo build selezionata. Loro sono.
  • Assicurarsi che entrambi i progetti siano per lo stesso Target Framework (.Net 4.0 Client Profile) .
  • In ProjectB -> Riferimenti -> ProjectA -> Proprietà, assicurarsi che "Copia locale" sia impostato su "True" _ (ho verificato che ProjectA.dll sia stato copiato correttamente)
  • Pulisci / ricostruisci la soluzione. Ho anche provato a cancellare manualmente le cartelle / bin e / obj in entrambi i progetti.
  • Riavvia Visual Studio. Riavvia il mio computer.
  • Guarda una copia completamente nuova del repository.

Ma ho ancora lo stesso errore. Non ho idea di cosa ho fatto per causare questo, né come risolverlo. Qualche idea?


1
Se hai una cronologia delle versioni nel repository, potresti verificare se ci sono alcune differenze nei file csproj?
Steve,

@Steve: Secondo Mercurial, nessun cambiamento oltre all'aggiunta di riferimenti a nuovi file .cs
BlueRaja - Danny Pflughoeft

Hai lo stesso comportamento su un'altra macchina? Qualcos'altro è cambiato sulla macchina (ad es. Aggiornamento di Windows, aggiornamenti delle dipendenze, ecc.)?
Mike Parkhill,

Hai provato a ripristinare quei nuovi file .cs?
Mike Parkhill,

2
Questo ha funzionato per me ............ stackoverflow.com/a/9419522/191403
Som

Risposte:


647

Sono abbastanza sicuro che stai avendo un conflitto a 32-bit / 64-bit. Sembra che il tuo progetto principale possa essere impostato su 32 bit mentre la classe a cui fa riferimento è impostata su 64 bit. Prova a guardare questa domanda SO e anche questa . Tra loro due, dovresti essere in grado di capire il tuo problema.


71
Do'h. In qualche modo mi manca completamente il menu a discesa "Platform Target" project-->properties-->build- era impostato per x86; impostandolo su "Qualsiasi CPU" risolto questo problema. Ho sempre pensato che questa impostazione fosse la stessa del menu a discesa "target piattaforma" nel gestore della configurazione, ma a quanto pare non lo è (in effetti, il "target piattaforma" nel gestore della configurazione non sembra fare nulla!)
BlueRaja - Danny Pflughoeft,

10
Verificare inoltre che il progetto non sia Qualsiasi CPU con Prefer 32 bit controllato. Progetto -> proprietà -> build
Reid Evans

26
PS: un altro motivo è che "Abilita applicazioni a 32 bit" è "falso" nelle impostazioni del pool di app. È necessario riavviare IIS dopo averlo impostato su true.
dvdmn,

3
Il peggio che mi è successo con questo errore è stato quando VS ha deciso di aggiungere <PlatformTarget>x86</PlatformTarget>uno dei progetti dipendenti senza motivo. Se non avessi esaminato SVN, non avrei mai capito perché la nostra app MVC non si avvia.
jahu,

1
Si prega di impostare in IIS DefaultAppPool-> Abilita applicazioni a 32 bit = True
Shantu

196

Potrebbe essere che stai affrontando il problema con il tuo sito Web dopo la distribuzione sul server.

Quindi è necessario regolare il pool di applicazioni per abilitare le applicazioni a 32 bit .

passi

  1. Apri Gestione IIS
  2. Fai clic su Pool di applicazioni
  3. Seleziona il pool di applicazioni che stai utilizzando
  4. Dal riquadro destro, fare clic su Impostazioni avanzate ...

  5. Impostare Abilita applicazioni a 32 bit su True

    Impostazioni avanzate Abilita 32 bit


1
Ho dimenticato qualcosa? OP parla di un'app console e non della distribuzione IIS: "ProjectB è un'applicazione console, che dipende da ProjectA"
MickyD,

129

Ho appena ricevuto questo messaggio di errore con IIS Express in Visual Studio 2015. Nel mio caso dovevo eseguire la versione a 64 bit di IIS Express:

Strumenti → Opzioni → Progetti e soluzioni → Progetti Web
Seleziona la casella "Usa la versione a 64 bit di IIS Express per siti Web e progetti".

Immagine dello schermo:

Schermata delle opzioni VS per Web Project.


2
È vero il contrario, avevo spuntato "Usa 64 bit" e avevo bisogno di deselezionarlo ...
cjb110

32

Ho avuto lo stesso problema. Avevo impostato il "Target Platform" del Progetto A ("Project A" (clic destro) -> Proprietà-> Build -> "Target Platform") su x86, ma ho mantenuto il Project B su "Any CPU". L'impostazione del Progetto B su "x86" ha risolto questo problema.


15

Ho riscontrato questo problema durante l'esecuzione di unit test (xunit) in Visual Studio 2015 e ho riscontrato la seguente correzione:

Menu Bar -> Test -> Test Settings -> Default Processor Architecture -> X64

7

Potrebbe essere necessario modificare l' impostazione del pool di applicazioni "Abilita applicazioni a 32 bit" su TRUE in IIS7 se nel progetto sono presenti almeno 1 dll \ exe a 32 bit.


OP parla di un'app console non IIS
MickyD

5

Prima di tutto ho ottenuto questo in VS2017 con un vecchio progetto di cui avevo bisogno per fare una piccola modifica e ho aggiornato tutti i progetti al framework 4.7.


Molti altri hanno menzionato la selezione in Any CPUgrado di risolvere questo problema.

Ci sono un paio di posti in cui devi farlo, e potrebbe non essere semplice come selezionare dal menu a discesa. Questo mi ha risolto:

1) Devi fare entrambi qui:

inserisci qui la descrizione dell'immagine

2) E anche in Configuration Manager(tasto destro sulla soluzione)

inserisci qui la descrizione dell'immagine

E se non ci fosse ???

Quindi fare clic Newe selezionare queste impostazioni: ( grazie @RckLN )

inserisci qui la descrizione dell'immagine


2

Ho avuto lo stesso problema con più progetti nella stessa soluzione, ho finito per impostare tutti i framework di destinazione su .NET Framework 4 e x86 per la CPU di destinazione e alla fine è stato compilato con successo.


1
Ha funzionato in versione ma non è riuscito in debug. Impostare tutto su .Net Framework 4 (NON aggiornamento 1) e il debug viene eseguito ora.
DCastenholz,

2

Potresti riscontrare questo problema anche se stai cercando di creare un pacchetto di un progetto a 64 bit con un programma di installazione MSI in VS. ("Il motivo è perché lo shim nativo impacchettato con il file .msi è un eseguibile a 32 bit.")

Vedi qui per maggiori dettagli: http://blogs.msdn.com/b/heaths/archive/2006/02/01/64-bit-managed-custom-actions-with-visual-studio.aspx


1
Valuta di riassumere l'articolo collegato a beneficio dei futuri lettori; nel caso in cui il collegamento si interrompa.
Bond - Java Bond

2

Nessuna di queste soluzioni ha funzionato per me, ma eliminando il contenuto delle cartelle bin e obj tutto è tornato a essere bello.


2

Ho ottenuto questo durante la creazione di un progetto tramite Visual Studio Online (VSTS) Build utilizzando Visual Studio BuildSteps.

La soluzione era:

  • Elimina la cartella di origine esistente
  • Impostare esplicitamente "Qualsiasi CPU" nella piattaforma per tutte le build di Visual Studio incluse le dipendenze (vedere la schermata seguente).
  • Riesegui la build

Schermata VSO


2

Quanto segue ha risolto il problema per me, deseleziona 'Prefer 32 bit': inserisci qui la descrizione dell'immagine


1

Ho riscontrato lo stesso problema. È saltato fuori dal nulla e mi è sembrato strano.

Nell'istantanea dell'eccezione, per FusionLog, ho visto quanto segue nel suo messaggio:

... C: \ Windows \ Microsoft.NET \ Framework64 ...

Ulteriori informazioni sul registro della fusione: http://msdn.microsoft.com/en-us/library/e74a18c4(v=vs.110).aspx

Tutti i progetti avevano una CPU target di AnyCPU. Ho modificato il progetto dell'applicazione (il progetto che fa riferimento a tutti gli altri progetti) con una CPU target di x86. Adesso funziona.

Non sono sicuro di come si sia verificato il missaggio della CPU di destinazione senza motivo apparente, ma è stato così.


1

Devo anche affrontare questo problema in un progetto, dopo alcuni minuti ho trovato la soluzione, questo problema è dovuto alla configurazione della CPU, Se stai usando Visual Studio 2010 o VS 2013 , vai alle proprietà del progetto e seleziona Compila dalla barra laterale e ci saranno 5 menu a discesa, il 5 ° menu a discesa sarà CPU di destinazione:, dovresti impostarlo su x86 o x64 in base alle tue esigenze anziché a qualsiasi CPU.

Il mio problema è stato risolto dopo averlo modificato in x86.


1

Questo può accadere anche solo avendo più framework supportati definiti nel file app.config e, forzando l'esecuzione dell'app in un framework .NET diverso da quello menzionato per primo nel file app.config .

E anche questo si attiva quando nel sistema sono disponibili entrambi i framework menzionati.

Per ovviare al problema, visualizzare il framework di destinazione che si intende utilizzare per il debug in app.config

ad esempio: se stai cercando di eseguire .NET 4, il file di configurazione dovrebbe avere qualcosa di simile a questo,

<supportedRuntime version="v4.0"/>
<supportedRuntime version="v2.0.50727"/>

1

Nel mio progetto per C #, proprietà del progetto -> [Build] -> Target piattaforma: qualsiasi CPU e deselezionare Prefer 32-bit per consentire al compilatore di scegliere automaticamente.


1

L'assembly Chilkat .NET 4.5 richiede che il runtime VC ++ 2012 o 2013 sia installato su qualsiasi computer su cui è in esecuzione l'applicazione. La maggior parte dei computer lo avrà già installato. Il tuo computer di sviluppo lo avrà perché Visual Studio è stato installato. Tuttavia, se la distribuzione su un computer in cui il runtime VC ++ richiesto non è disponibile, si verificherà l'errore sopra riportato:

Installa tutti i pacchetti seguenti

Pacchetti ridistribuibili di Visual C ++ per Visual Studio 2013 - vcredist_x64

Pacchetti ridistribuibili di Visual C ++ per Visual Studio 2013 - vcredist_x86

Pacchetti ridistribuibili di Visual C ++ per Visual Studio 2012 - vcredist_x64

Pacchetti ridistribuibili di Visual C ++ per Visual Studio 2012 - vcredist_x86



0

Può essere un po 'divertente, ma ho avuto lo stesso problema con il normale codice di lavoro. Ho aggiunto StreamWriter e StreamReader e mi ha dato quell'errore. La soluzione è stata quella di prendere quel codice tra parentesi di commento, quindi ho eseguito il debug e ha ricominciato a funzionare



0

Nel mio caso mancava una dipendenza nella dll che generava questa eccezione. Ho controllato con Dependency Walker, ho aggiunto la dll mancante e il problema è stato risolto.

Più specificamente, in qualche modo ho corrotto il mio opencv_core340.dll aggiungendo accidentalmente parole chiave SVN ad esso, e quindi la mia DLL non poteva più usarlo. Tuttavia, non credo che la soluzione a questo problema dipenda dal fatto che la DLL sia danneggiata o mancante. Lo sto solo aggiungendo per fornire informazioni complete.


0

Sparare! Conoscevo questo problema. Pensavo di fare tutto bene fino a quando non ho visto 'x86' nella finestra di output VS ed è stato allora che ho scoperto la causa. Oggi ho perso qualche minuto.

La configurazione nella finestra "Pubblica" era impostata su "x86"; mentre, ovunque, era "x64".

Assicurati che sia sincronizzato tra Configuration Manager, pubblica le impostazioni, le configurazioni della soluzione e le impostazioni IIS (se è il tuo server web).

Inoltre, tieni presente che VS è un'app a 32 bit e IIS a 64 bit. Le app a 32 bit sono disabilitate per impostazione predefinita in IIS.

inserisci qui la descrizione dell'immagine


0

Ho rilevato qualcosa di diverso dalle altre risposte. Raggiungere questa eccezione nel mio progetto è stato il risultato di una compilazione corrotta. Senza apportare modifiche, solo forzando la ricostruzione , è stato risolto.


0

Ho avuto lo stesso problema. Il progetto B nel mio caso era una .Net Core Class Library con un Nuget "Microsoft.Management.Infrastructure" installato. L'errore era che ho chiamato il mio progetto B "MI". Ho cambiato il nome del progetto in qualcos'altro e all'improvviso tutto ha funzionato di nuovo.


-1

La mia macchina mi ha mostrato un aggiornamento del BIOS e mi chiedevo se ciò avesse a che fare con l'improvvisa comparsa di questo errore. E dopo aver effettuato l'aggiornamento, l'errore è stato risolto e la soluzione è stata realizzata correttamente.


-1

Stai cercando di eseguire il tuo file .exe dal cmd? Questo è stato il mio errore Basta eseguire il file .exe facendo doppio clic su di esso. Se si tratta di un .NET Core SCD per Windows 8.1 / Windows Server 2012 R2 x64.

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.