"Es wurde versucht, ein Programm mit einem falschen Format zu laden", auch wenn die Plattformen identisch sind

461

Ich rufe Funktionen von einer nicht verwalteten 32-Bit-DLL auf einem 64-Bit-System auf. Was ich bekomme ist:

BadImageFormatException: Es wurde versucht, ein Programm mit einem falschen Format zu laden. (Ausnahme von HRESULT: 0x8007000B)

Zuerst hatte ich meine Projekte auf die Any CPU-Plattform eingestellt, also habe ich beide auf x86 geändert, aber dieser Fehler tritt immer noch auf. Das ist wirklich die einzige Lösung, die ich dafür kenne.

Die DLLs sind nicht beschädigt oder so, weil ich sie mit anderen Programmen verwenden kann (für die ich nicht die Quelle habe). Ich dachte, dass es vielleicht keine Abhängigkeit gibt, aber ich habe nachgesehen und sie sind alle da. Und würde es DllNotFoundExceptionin diesem Fall nicht einen werfen ?

Was kann ich sonst noch tun? Und bevor Sie sagen "Verwenden Sie stattdessen eine nicht verwaltete 64-Bit-DLL", lassen Sie mich darauf hinweisen, dass es keine gibt. ;)

David Brown
quelle
1
Welche Projekte haben Sie auf x86 geändert? Und wie führen Sie sie aus, wenn Sie die Ausnahme erhalten, über den Debugger oder manuell? Wenn letzteres der Fall ist, haben Sie bemerkt, dass Sie beim Wechsel zu x86 einen neuen Ordner in Ihrem bin \ -Verzeichnis haben? Es ist im Grunde jetzt bin \ x86 \ Debug für die Dateien.
Lasse V. Karlsen
Können Sie überprüfen, ob die ausführbare Datei im 32-Bit-Modus ausgeführt wird (* 32 im Prozessmanager)?
JP Alioto
@Lasse V. Karlsen: Ja, ich habe das x86-Bit aus dem Ausgabepfad entfernt, als ich die Plattform in jedem Projekt geändert habe. Mein erstes Projekt ist eine DLL, die die Funktionen in die nicht verwaltete DLL einschließt. Das zweite Projekt ist eine ausführbare Datei, die den Wrapper in der ersten DLL verwendet. Beide sind auf x86 eingestellt.
David Brown
@JP: Tatsächlich zeigt der Prozessmanager nicht an, dass er als 32-Bit-Prozess ausgeführt wird. Warum ist das so?
David Brown

Antworten:

532

Wenn Sie versuchen, 32-Bit-Anwendungen auf IIS 7 (und / oder 64-Bit-Betriebssystemcomputern) auszuführen, wird der gleiche Fehler angezeigt. Klicken Sie in IIS 7 mit der rechten Maustaste auf den Anwendungspool der Anwendungen, gehen Sie zu "Erweiterte Einstellungen" und ändern Sie "32-Bit-Anwendungen aktivieren" in "WAHR".

Starten Sie Ihre Website neu und es sollte funktionieren.

Geben Sie hier die Bildbeschreibung ein

bluwater2001
quelle
1
Oh, meine Tage habe ich damit verbracht, zusätzliche IIS-Komponenten zu installieren, als dies die Antwort war ... Kann jemand einen Nachteil für die Auswahl dieser Option vorschlagen?
Notidaho
3
Hier ist eine gute Diskussion über die Frage der Leistung in Bezug auf diese: stackoverflow.com/questions/507820/…
Ben Power
Ich habe ein Problem mit SharpSvn und das hilft nicht. :( Sth ist sehr falsch mit dieser Versammlung Ich sage Ihnen ...
user2173353
4
Diese Antwort ist ein WTF für mich, weil die Frage IIS überhaupt nicht erwähnt!
Kristianp
129

Irgendwie war das Kontrollkästchen " Erstellen" im Konfigurationsmanager für meine ausführbare Datei deaktiviert, sodass es immer noch mit dem alten Build "Beliebige CPU" ausgeführt wurde. Nachdem ich das behoben hatte, beschwerte sich Visual Studio, dass die Assembly nicht debuggt werden konnte, dies wurde jedoch mit einem Neustart behoben.

David Brown
quelle
Vielen Dank. Das hat mich auch erwischt. Checked Build in Configuration Manager und jetzt funktioniert es (WPF-Desktop-Anwendung).
Danglund
1
Wenn Sie alle oben genannten Schritte ausgeführt und Ihre Plattformeinstellungen überprüft, Konfigurationseinstellungen erstellt, die Lösung bereinigt haben und sie immer noch nicht funktioniert, suchen Sie nach allen Instanzen der DLL und löschen Sie sie.
Will Calderwood
mit VS 2015 ist dies immer noch gültig - obwohl ich nicht neu starten musste :)
ungläubig
Das ist es! Ein erneuter Besuch Ihrer Configuration Manager-Einstellungen ist die Antwort.
AndyUK
74

Klicken Sie in Visual Studio mit der rechten Maustaste auf Ihr Projekt -> Klicken Sie im linken Bereich auf die Registerkarte Erstellen .

Projekteigenschaften, Registerkarte "Erstellen"

Wählen Sie unter Plattformziel x86 aus (oder allgemeiner die Architektur , die mit der Bibliothek übereinstimmt, mit der Sie verknüpfen).

Projekteigenschaften, Plattformziel

Ich hoffe das hilft jemandem! :) :)

Marvin Thobejane
quelle
2
Dies hat mein Problem in VS2013 behoben. Ich habe festgestellt, dass eine alternative Lösung darin besteht, "Plattformziel" als "Beliebige CPU" zu belassen, aber das Kontrollkästchen "32-Bit bevorzugen" zu aktivieren.
user1069816
2
Obwohl Sie .NET 4.5 oder höher verwenden müssen, um das Kontrollkästchen "32-Bit bevorzugen"
aktivieren zu können
1
Ja, aber ich habe mein Projekt in 'Beliebige CPU' in 'x64' konvertiert. Mein 32-Bit-Projekt funktioniert einwandfrei, aber derselbe Code, den ich in 64-Bit konvertiert habe, funktioniert nicht so gut wie 32-Bit. Können Sie mir bitte den richtigen 64-Bit-Konvertierungsprozess geben ...
Ismayil S
@IsmayilS stellen Sie sicher, dass Sie eine 64-Bit-Version der Bibliothek verwenden, auf die Sie verlinken
Marvin Thobejane
53

Ich hatte gerade auch dieses Problem. Versuchte alle Vorschläge hier, aber sie haben nicht geholfen.

Ich habe eine andere Sache gefunden, um zu überprüfen, ob dies für mich behoben ist. Klicken Sie in Visual Studio mit der rechten Maustaste auf das Projekt und öffnen Sie "Eigenschaften". Klicken Sie auf die Registerkarte "Kompilieren" (oder "Erstellen") und dann unten auf "Erweiterte Kompilierungsoptionen".

Überprüfen Sie die Dropdown-Liste "Ziel-CPU". Es sollte mit der "Plattform" übereinstimmen, die Sie erstellen. Das heißt, wenn Sie "Beliebige CPU" erstellen, sollte "Ziel-CPU" "Beliebige CPU" sagen. Gehen Sie alle Ihre Plattformen durch, indem Sie sie aktivieren, und überprüfen Sie diese Einstellung.

Denis
quelle
2
Und für diejenigen von uns, die nur den Compiler verwenden, bestand mein Fix darin, den Compiler-Flags "/ platform: x86" hinzuzufügen.
Urchin
Das hat es auch für mich behoben. Ich musste das "Plattformziel" auf der Registerkarte "Erstellen" anpassen.
Jowen
Wenn Sie 64-Bit verwenden, aktivieren Sie auch das Flag "32-Bit bevorzugen". Ich musste es für mich deaktivieren.
N4ppeL
51

Wenn Sie auf diesen Fehler stoßen, wenn Sie auf die grüne Pfeiltaste klicken, um die Anwendung auszuführen, die App jedoch weiterhin in 64-Bit ausführen möchten. Sie können dies in VS 2013, 2015, 2017 und 2019 tun

Gehen Sie zu: Extras> Optionen> Projekte und Lösungen> Webprojekte> Verwenden Sie die 64-Bit-Version von IIS Express

Paibambus
quelle
3
Vielen Dank. Ich habe so viele ausprobiert und nichts hat geholfen. Du bist mein Lebensretter. Ich habe ein 64-Bit-Betriebssystem und ein 64-Bit-Visual Studio installiert [das aus unbekannten Gründen immer noch als 32-Bit ausgeführt wird]. Als ich mein Plattformziel auf x64 stellte, wurde der Fehler BadImageFormatException ausgelöst. Mit Ihrem Fix hat es funktioniert. Ich habe dir eine Gegenstimme gegeben. Sie rocken
SKCS Kamal
Ich bin froh, dass ich helfen konnte :)
Paibamboo
Das ist die Antwort, die ich brauche. Vielen Dank!
Yushulx
Vielen Dank, dies hat das Problem gelöst. Es funktioniert gut mit dem 32-Bit-Prozess von Visual Studio 2017.
Samir105
1
funktioniert immer noch mit VS 2019, danke
Jake Gaston
36

Wenn Sie eine beliebige CPU verwenden , kann dieses Problem auftreten, wenn die Option 32-Bit bevorzugen aktiviert ist:

Stellen Sie sicher , deaktivieren Sie diese Option in der Unterkunft des Projekts Build - Registerkarte!

Geben Sie hier die Bildbeschreibung ein

Drew Noakes
quelle
3
Es wäre hilfreich, wenn Sie angeben könnten, wo in Visual Studio diese Option zu finden ist.
Tryse
@trysis, diese Option befindet sich auf der Seite Erstellen im Bereich Projekteinstellungen.
Drew Noakes
1
Ich sagte, es wäre hilfreich, es einzufügen. Nach dem heutigen Stand dieser Antwort gibt es keinen Kontext, um dem unglücklichen, möglicherweise neuen Benutzer von StackOverflow mitzuteilen, wo es zu finden ist.
Trysis
Was ist der Weg, um dieses Formular zu erhalten? Ich kann es nicht finden
Adolfo Correa
Klicken Sie in Visual Studio mit der rechten Maustaste auf das Projekt und wählen Sie "Eigenschaften".
Drew Noakes
8

Ein bisschen vom Thema für diesen Beitrag entfernt, aber die Suche nach dieser Fehlermeldung hat mich hierher gebracht.

Wenn Sie über ein Teamsystem erstellen und diesen Fehler erhalten, verfügt die Registerkarte "Build-Definitionsprozess" über die Einstellung "MSBuild Platform". Wenn dies auf "Auto" eingestellt ist, kann dieses Problem auftreten. Durch Ändern in "X86" kann der Fehler ebenfalls behoben werden.

StingyJack
quelle
Dies ist die naheliegendste Antwort auf das, was ich erlebt habe. Ich hatte eine DLL, die x86 sein musste. Ich habe es in einem anderen Projekt verwendet, das standardmäßig AnyCPU war. Sie müssen nur zusammenpassen. In diesem Fall machte es keinen großen Unterschied, also habe ich das neue Projekt auf x86 geändert.
Greg
8

In meinem Fall habe ich eine native DLL in C # verwendet. Diese DLL hing von einigen anderen fehlenden DLLs ab. Sobald diese anderen DLLs hinzugefügt wurden, funktionierte alles.

Tomasz Stypich
quelle
4

Aufbauend auf der Antwort von @paibamboo

Er sagte: Gehen Sie zu: Extras> Optionen> Projekte und Lösungen> Webprojekte> Verwenden Sie die 64-Bit-Version von IIS Express

Mein Mitarbeiter ließ dieses Kontrollkästchen aktivieren (er suchte ausdrücklich danach), hatte aber die fragliche Fehlermeldung. Nach einigen Stunden deaktivierte er das Kontrollkästchen und überprüfte es erneut. Siehe da: Der Code lief jetzt mit Erfolg.

Es scheint, dass es zwei Stellen gibt, an denen der Status dieser Box gespeichert wird, die nicht mehr synchron sind. Durch Deaktivieren und erneutes Aktivieren wird es erneut synchronisiert.

Frage an sachkundigere Benutzer: Gab es letzte Woche (für VS 2015) ein Update oder etwas, das die Zustände de-synchronisiert hat?

MilConDoin
quelle
3

Siehe auch diese Antwort , die das gleiche Problem für mich gelöst hat.

Gepostet von Luis Mack am 12.05.2010 um 08:50 Uhr Ich habe das gleiche Problem nur für ein bestimmtes Projekt beim Kompilieren auf einem 64-Bit-Computer gefunden. Eine Korrektur, die SEEMS zu funktionieren scheint, besteht darin, jedes Mal, wenn die Benutzersteuerung oder das Formular im Designer bearbeitet wird, ein Zeichen im Bildstrom manuell zu ändern

 AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj00LjAuMC4w

Ändern

 AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj0yLjAuMC4w

Das ist 00LjAuMC4w zurück zu 0yLjAuMC4w am Ende der Zeile (00 zurück zu 0y)

Shaul Behr
quelle
1
Eine kurze Zusammenfassung des Links wäre hilfreich @Shaul :)
Marvin Thobejane
Großartig. Vielen Dank, das Briefing fügt Ihrem Kommentar Inhalt hinzu
Marvin Thobejane
2

In meinem Fall verwende ich eine winzige EXE-Datei, die die referenzierten DLLs über Reflection neu lädt. Also mache ich einfach diese Schritte, die meinen Tag retten:

Aus den Projekteigenschaften im Solution Explorer wähle ich auf der Registerkarte "Erstellen" die Zielplattform von x86 aus

asdf_enel_hak
quelle
2

In meinem Fall habe ich Tests über MSTest ausgeführt und festgestellt, dass ich sowohl eine 32-Bit- als auch eine 64-Bit-DLL im Testverzeichnis bereitgestellt habe. Das Programm bevorzugte die 64-Bit-DLL und verursachte einen Fehlschlag.

TL; DR Stellen Sie sicher, dass Sie nur 32-Bit-DLLs für Tests bereitstellen.

Mike Cluck
quelle
2

Wir hatten ein ähnliches Problem und konnten es beheben, indem wir das Plattformziel auf x86 setzten. Projekteigenschaften-> erstellen

Joe
quelle
X86-DLLs unterscheiden sich also von x64? Gibt es eine Möglichkeit, dies in einer referenzierten DLL-Datei zu erkennen?
NoBugs
@ NoBugs Sieht aus wie Sie können. Schauen Sie sich diesen Thread an
Joe
1

Ich habe dieses Problem auf Windows-Art gelöst. Nachdem ich alle meine Einstellungen überprüft, die Lösung gereinigt und neu erstellt habe, schließe ich die Lösung einfach und öffne sie erneut. Dann hat es funktioniert, so dass VS während der Reinigung wahrscheinlich einige Dinge nicht losgeworden ist. Wenn logische Lösungen nicht funktionieren, wende ich mich normalerweise unlogischen (oder scheinbar unlogischen) Lösungen zu. Windows lässt mich nicht im Stich. :) :)

user1771386
quelle
1

Ich konnte dieses Problem beheben, indem ich meine Build-Version mit der .NET-Version auf dem Server abgeglichen habe.

Ich habe auf die EXE-Datei doppelklickt, um zu sehen, was passieren würde, und es hat mir gesagt, dass ich 4.5 installieren soll.

Also habe ich auf 4.0 heruntergestuft und es hat funktioniert!

Stellen Sie also sicher, dass Ihre Versionen übereinstimmen. Es lief gut auf meiner Entwicklungsbox, aber der Server hatte eine ältere .NET-Version.

Nateous
quelle
1

In meinem Fall war es falscher Inhalt der Datei. Die DLL wurde aus dem Internet heruntergeladen, aber der Inhalt der DLL war eine HTML-Seite: D Versuchen Sie zu überprüfen, ob es sich um eine Binärdatei handelt, ob es sich um eine korrekte DLL handelt :)

Ludwo
quelle
1

Wir hatten das gleiche Problem in .NET Core. Die Lösung bestand darin, die 32-Bit-.netcore-Laufzeit herunterzuladen und Ihr Projektziel festzulegenx86

In Ihrer csprojDatei hinzufügen

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

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

Dies wurde für einen Windows-Computer verwendet, Sie müssten Pfade und dergleichen für Linux / OSX anpassen

Samir Banjanovic
quelle
0

Wenn Sie nicht verwaltete DLL importieren, verwenden Sie

CallingConvention = CallingConvention.Cdecl 

in Ihrer DLL-Importmethode.

Ramkumar Shanmugam
quelle
0

1: Gehen Sie zu: Extras> Optionen> Projekte und Lösungen> Webprojekte> Verwenden Sie die 64-Bit-Version von IIS Express 2: Ändern Sie die folgende Einstellung für das Webdienstprojekt. Geben Sie hier die Bildbeschreibung ein

Mani
quelle