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 DllNotFoundException
in 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. ;)
Antworten:
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.
quelle
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.
quelle
Klicken Sie in Visual Studio mit der rechten Maustaste auf Ihr Projekt -> Klicken Sie im linken Bereich auf die Registerkarte Erstellen .
Wählen Sie unter Plattformziel x86 aus (oder allgemeiner die Architektur , die mit der Bibliothek übereinstimmt, mit der Sie verknüpfen).
Ich hoffe das hilft jemandem! :) :)
quelle
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.
quelle
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
quelle
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!
quelle
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.
quelle
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.
quelle
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?
quelle
Siehe auch diese Antwort , die das gleiche Problem für mich gelöst hat.
quelle
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
quelle
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.
quelle
Wir hatten ein ähnliches Problem und konnten es beheben, indem wir das Plattformziel auf x86 setzten.
quelle
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. :) :)
quelle
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.
quelle
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 :)
quelle
Wir hatten das gleiche Problem in .NET Core. Die Lösung bestand darin, die 32-Bit-.netcore-Laufzeit herunterzuladen und Ihr Projektziel festzulegen
x86
In Ihrer
csproj
Datei hinzufügenDies wurde für einen Windows-Computer verwendet, Sie müssten Pfade und dergleichen für Linux / OSX anpassen
quelle
Wenn Sie nicht verwaltete DLL importieren, verwenden Sie
in Ihrer DLL-Importmethode.
quelle
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.
quelle