2012-12-21 5 views
7

Nach MSDN documentation,Assembly.LoadFrom BadImageFormatException - unterschiedliches Verhalten in .NET 4.0 und 4.5 (möglicherweise undokumentiert)

public static Assembly LoadFrom(string assemblyFile) 

wirft BadImageFormatException wenn

assemblyFile is not a valid assembly. 
-or- 
Version 2.0 or later of the common language runtime is currently loaded 
and assemblyFile was compiled with a later version. 

Eigentlich gibt es einen zusätzlichen Fall - loading Assembly, die für x86 von Assembly erstellt wird, die im x64-Modus ausgeführt wird. Vielleicht ist es in "keine gültige Versammlung" Aussage enthalten, ich weiß es nicht. Aber das ist ein vernünftiger Grund für eine Ausnahme.

Ok, aber in .NET 4.5 ist es nicht! Ich habe eine .NET 4.5 WPF App, die aus irgendeinem Grund verschiedene Anwendungen lädt. Es baut für jede CPU und ich starte es auf x64 Win 7. Ich habe es auf einer ausführbaren Datei getestet, die für .NET 4.0 x86 gebaut wurde, und es hat gut funktioniert. Aber als ich meine App auf .NET 4.0 umstellte, stürzte sie auf Assembly.Load Methode ab!

Also, meine Frage ist, vermisse ich etwas? Wenn nicht, wie haben sie das getan - x86-Assembly vom x64-Prozess in .NET 4.5 geladen? Mir fehlt an dieser Stelle etwas Verständnis.

aktualisieren

Dank Hans Passant, ich habe meine Fehler herausgefunden. Tatsächlich ist das Verhalten von Assembly.Loadnicht anders. Es stellte sich heraus, ich habe keine Prefer 32-bit Option in den Projekteinstellungen (oder Prefer32Bit Tag in .csproj Datei). Deshalb ist mein Prozess in .NET 4.5 ran in a 32-bit mode. Diese Einstellung war wahr, als ich WPF .NET 4.5 Projekt erstellt. Als ich dann zu .NET 4.0 switchte, wurde es inaktiv, weil es in .NET 4.0 keine solche Option gab. Und als ich zurück zu .NET 4.5 wechselte, wurde es false, das ist so, ich denke, aus Gründen der Kompatibilität.

+0

"Wenn ich meine App auf .NET 4.0 umgestellt habe, meinst du .NET 4.5? ;) – HericDenis

+0

Nein, es wurde ursprünglich für 4.5 gebaut, aber dann haben wir festgestellt, dass wir es brauchen, um auf 4.0 – EvAlex

+0

zu arbeiten. Wenn dies ein Laufzeitproblem ist, ist es nicht speziell mit den gelieferten Compilern dieser Versionen verbunden. Nicht markiert. – leppie

Antwort

2

Lassen Sie uns schnell eine Annahme aus der Tabelle löschen, es gibt keine Möglichkeit, ein anderes Verhalten auf einem Computer zu haben, auf dem .NET 4.5 installiert ist. Targeting 4.0 macht zur Laufzeit keinen Unterschied. Das einzige, was tut, ist eine andere Gruppe von Referenz-Assemblies zu wählen, sie verhindern, dass Sie versehentlich eine Klasse verwenden, die auf .NET 4.5, aber nicht auf .NET 4.0 verfügbar ist.

Es gibt keine Möglichkeit, sowohl 4.0 als auch 4.5 auf demselben Computer zu installieren. .NET 4.5 ist keine Seite-an-Seite-Version von .NET Framework, wie 3.5 und 4.0 sind nebeneinander. Die Installation von 4.5 ersetzt eine installierte Version 4.0. Die CLR, der Jitter, alle Laufzeitassemblys und der C# -Compiler.

Hier ist es am besten, sich auf die Plattform-Zieleinstellung Ihres EXE-Projekts zu konzentrieren, die die Bissigkeit des Prozesses auswählt. Die Art von Fehlern, die Sie machen können, besteht darin, zu vergessen, dass die Einstellung für den Debug- und den Release-Build unterschiedlich sein kann. Und vorausgesetzt, dass die Combobox "Aktive Lösungsplattform" in Build + Configuration Manager keine Auswirkungen hat. Es ist nicht nur die Projekt + Eigenschaften, Erstellen Registerkarte, Plattform Zieleinstellung wichtig. Dies ist eine sehr peinliche Falle, in die viele Programmierer geraten sind.

+1

Vielen Dank für Ihre ausführliche Antwort! Tatsächlich ist mir bewusst, wie Sie die Zielplattform für das Projekt richtig festlegen können. Aber Ihre Antwort hat mir geholfen, die Ursache meines Problems aufzuspüren. Jetzt aktualisiere ich meine Frage mit der Erklärung des Problems und markiere deine Antwort als die richtige. Mache ich gerade hier? – EvAlex

Verwandte Themen