563 Stimmen

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

Ich rufe Funktionen von einer 32-Bit-unmanaged 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 Plattform Any CPU eingestellt, also habe ich sie beide auf x86 geändert, aber dieser Fehler tritt immer noch auf. Das ist wirklich die einzige Lösung, die ich für dieses Problem kenne.

Die DLLs sind nicht beschädigt oder so, denn ich kann sie mit anderen Programmen verwenden (für die ich den Quellcode nicht habe). Ich dachte, dass es vielleicht eine Abhängigkeit nicht findet, aber ich habe es überprüft und sie sind alle da. Außerdem, würde es nicht eine DllNotFoundException in diesem Fall?

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 ;)

2voto

Mike Cluck Punkte 30436

In meinem Fall führte ich Tests über MSTest aus und fand heraus, dass ich sowohl eine 32-Bit- als auch eine 64-Bit-DLL im Testverzeichnis bereitstellte. Das Programm bevorzugte die 64-Bit-DLL und verursachte einen Fehler.

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

2voto

Wenn Sie eine nicht verwaltete DLL importieren, verwenden Sie

CallingConvention = CallingConvention.Cdecl 

in Ihrer DLL-Importmethode.

2voto

asdf_enel_hak Punkte 7238

In meinem Fall verwende ich eine winzige Exe, die die referenzierten DLLs über Reflection nachlädt. Also mache ich einfach diese Schritte, die meinen Tag retten:

In den Projekteigenschaften im Lösungsexplorer wähle ich auf der Registerkarte "Build" die Zielplattform x86

1voto

Samir Banjanovic Punkte 410

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

In Ihrem csproj Datei hinzufügen

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

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

Dies wurde für einen Windows-Rechner verwendet, für Linux/OSX müssen Sie die Pfade usw. anpassen

1voto

user1771386 Punkte 73

Ich habe dieses Problem auf "Windows"-Art gelöst. Nachdem ich alle Einstellungen überprüft, die Projektmappe bereinigt und neu erstellt hatte, schloss ich die Projektmappe einfach und öffnete sie erneut. Dann funktionierte es, also hat VS wahrscheinlich einige Dinge bei der Reinigung nicht entfernt. Wenn logische Lösungen nicht funktionieren, greife ich normalerweise zu unlogischen (oder scheinbar unlogischen) Lösungen. Windows lässt mich nicht im Stich :)

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X