wake-up-neo.com

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

Ich rufe Funktionen von einem 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 korrupt 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. Außerdem würde es in diesem Fall nicht ein DllNotFoundException werfen?

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

437
David Brown

Irgendwie war das Kontrollkästchen Build im Konfigurationsmanager für meine ausführbare Datei deaktiviert, sodass sie weiterhin mit dem alten Build Any CPU ausgeführt wurde. Nachdem ich das behoben hatte, beschwerte sich Visual Studio, dass es das Assembly nicht debuggen konnte, aber das wurde mit einem Neustart behoben.

125
David Brown

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

Starten Sie Ihre Website neu und es sollte funktionieren.

enter image description here

513
bluwater2001

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

Project properties, build tab

wählen Sie unter Plattformziel x86 (oder allgemeiner Architektur aus, um mit der Bibliothek übereinzustimmen, zu der Sie eine Verknüpfung herstellen)

Project properties, platform target

Ich hoffe das hilft jemandem! :)

71

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

Ich habe noch etwas gefunden, um zu überprüfen, ob es 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. Durchsuchen Sie alle Ihre Plattformen, indem Sie sie aktivieren, und überprüfen Sie diese Einstellung.

50
Denis

Wenn dieser Fehler auftritt, wenn Sie auf die Schaltfläche mit dem grünen Pfeil 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 und 2017 tun

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

40
paibamboo

Wenn Sie Any CP verwenden, kann dieses Problem auftreten, wenn die Option Prefer 32-bit ​​aktiviert ist:

Stellen Sie sicher, dass Sie diese Option in der Registerkarte Build der Projekteigenschaft deaktivieren !

enter image description here

34
Drew Noakes

Ein bisschen abseits des Themas für diesen Beitrag, aber die Suche nach dieser Fehlermeldung brachte mich hierher.

Wenn Sie über Team System erstellen und diese Fehlermeldung erhalten, enthält die Registerkarte "Builddefinitionsprozess" die Einstellung "MSBuild Platform". Wenn dies auf "Auto" eingestellt ist, kann dieses Problem auftreten. Durch Ändern auf "X86" kann der Fehler ebenfalls behoben werden.

8
StingyJack

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.

7
Tomasz Stypich

Siehe auch diese Antwort , das 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 gefunden, nur für ein bestimmtes Projekt beim Kompilieren auf einem 64-Bit-Computer. Ein Fix, der funktioniert, besteht darin, jedes Mal, wenn das Benutzersteuerelement oder Formular im Designer bearbeitet wird, ein Zeichen im Bilddatenstrom manuell zu ändern

 AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj00LjAuMC4w

Ändern

 AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj0yLjAuMC4w

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

3
Shaul Behr

In meinem Fall habe ich Tests über MSTest ausgeführt und festgestellt, dass ich sowohl eine 32-Bit- als auch eine 64-Bit-Version von DLL im Testverzeichnis bereitgestellt habe. Das Programm hat die 64-Bit-Version von DLL favorisiert und einen Fehler verursacht.

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

2
Mike Cluck

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:

In den Projekteigenschaften des Projektmappen-Explorers auf der Registerkarte "Erstellen" wähle ich das Ziel-Plat von x86 aus

2
asdf_enel_hak

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 Kollege hatte dieses Kontrollkästchen aktiviert (er hat explizit danach gesucht), hatte aber die betreffende Fehlermeldung. Nach einigen Stunden entfernte er das Häkchen und überprüfte es erneut. Siehe da: Der Code lief jetzt mit Erfolg.

Es scheint, dass es zwei Orte gibt, an denen der Status dieser Box gespeichert wird, der nicht mehr synchron ist. Durch Deaktivieren und erneutes Überprüfen wird die Synchronisierung erneut durchgeführt.

Frage für sachkundigere Benutzer: Gab es letzte Woche (für VS 2015) ein Update oder etwas, das die Synchronisierung der Zustände aufgehoben hat?

1
MilConDoin

In meinem Fall war der Inhalt der Datei falsch. DLL wurde aus dem Web heruntergeladen, der Inhalt der DLL war jedoch eine HTML-Seite: D Überprüfen Sie, ob es sich um eine Binärdatei handelt, wenn dies richtig erscheint. DLL :)

1
Ludwo

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

Ich habe die .exe doppelt angeklickt, 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 Dev-Box, aber der Server hatte eine ältere .NET-Version.

1
Nateous

Ich habe dieses Problem auf die 'Windows'-Art gelöst. Nachdem ich alle meine Einstellungen überprüft, die Lösung bereinigt und neu erstellt habe, schließe ich die Lösung einfach und öffne sie erneut. Dann hat es geklappt, also hat VS beim Putzen wahrscheinlich nichts losgeworden. Wenn logische Lösungen nicht funktionieren, greife ich normalerweise zu unlogischen (oder scheinbar unlogischen) Lösungen. Windows lässt mich nicht im Stich. :)

1
user1771386

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

0
Joe

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

Fügen Sie in Ihrer csproj -Datei hinzu

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

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

Dies wurde für einen Windows-Computer verwendet, für Linux/OSX mussten die Pfade angepasst werden

0