webentwicklung-frage-antwort-db.com.de

Ist es möglich, eine .NET 4.5-App unter XP auszuführen?

Zuerst habe ich folgendes gelesen:

Vom letzten Aufzählungspunkt an glaube ich, dass es keinen Ausweg gibt, aber ich musste sehen, ob ich eine endgültige Antwort bekommen kann, da mein Team von .NET 4.0 auf .NET 4.5 upgraden möchte. Wir müssen jedoch XP unterstützen.

Gibt es keine Möglichkeit nach .NET 4.5 zu wechseln, wenn wir XP unterstützen wollen?

Das einzige, was ich mir vorstellen könnte, ist die Erstellung von zwei separaten Lösungen, aber dann müssten die Codebasen abweichen, wenn wir .NET 4.5-Features verwenden würden.

Ich suche also nach einer erstaunlichen Lösung, die ich nicht finden konnte, und andere, die ich vielleicht bereits kenne.

85
Justin Pihony

Ich zögere, diese Antwort zu posten, es ist zwar technisch möglich, aber in der Praxis funktioniert es nicht so gut. Die Versionsnummern der CLR und der Core Framework-Assemblys wurden in 4.5 nicht geändert. Sie haben weiterhin die Version 4.0.30319 der CLR als Ziel und die Versionsnummern der Framework-Assembly lauten weiterhin 4.0.0.0. Das einzige, was das Assembly-Manifest auszeichnet, wenn Sie es mit einem Disassembler wie ildasm.exe betrachten, ist das Vorhandensein eines Attributs [TargetFramework], das besagt, dass 4.5 benötigt wird und geändert werden muss. Eigentlich nicht so einfach, es wird vom Compiler ausgegeben.

Der größte Unterschied ist nicht so offensichtlich, Microsoft hat eine überfällige Änderung im ausführbaren Header der Assemblys vorgenommen. Womit angegeben wird, mit welcher Windows-Version die ausführbare Datei kompatibel ist. XP gehört zu einer früheren Windows-Generation, die mit Windows 2000 gestartet wurde. Die Hauptversionsnummer ist 5. Vista war der Start der aktuellen Generation, Hauptversionsnummer 6.

.NET-Compiler haben immer die Mindestversionsnummer 4.00 angegeben, die Version von Windows NT und Windows 9x. Sie können dies sehen, indem Sie dumpbin.exe/headers auf der Assembly ausführen. Die Beispielausgabe sieht folgendermaßen aus:

OPTIONAL HEADER VALUES
             10B magic # (PE32)
            ...
            4.00 operating system version
            0.00 image version
            4.00 subsystem version              // <=== here!!
               0 Win32 version
            ...

Neu in .NET 4.5 ist, dass die Compiler diese Subsystemversion auf 6.00 ändern. Eine Änderung, die zum großen Teil überfällig war, weil Windows auf diese Zahl achtet und nicht nur prüft, ob sie klein genug ist. Außerdem werden AppCompat-Funktionen aktiviert, da davon ausgegangen wird, dass das Programm für ältere Windows-Versionen geschrieben wurde. Diese Funktionen verursachen Probleme, insbesondere die Art und Weise, wie Windows in Aero in etwa die Größe eines Fensters hat, ist problematisch. Es hört auf, an den fetten Rändern eines Aero-Fensters zu lügen, wenn es erkennt, dass das Programm für eine Windows-Version mit Aero entwickelt wurde.

Sie können diese Versionsnummer ändern und auf 4,00 zurücksetzen, indem Sie Editbin.exe auf Ihren Assemblys mit der Option/subsystem ausführen. Diese Antwort zeigt ein Beispiel für ein Postbuild-Ereignis.

Das ist jedoch ungefähr das Ende der guten Nachrichten. Ein bedeutendes Problem ist, dass .NET 4.5 nicht sehr kompatibel mit .NET 4.0 ist. Das mit Abstand größte Problem ist, dass die Klassen von einer Versammlung in eine andere verlegt wurden. Dies geschah vor allem für das Attribut [Extension]. Zuvor in System.Core.dll wurde es in .NET 4.5 in Mscorlib.dll verschoben. Das ist ein Kaboom für XP wenn Sie Ihre eigenen Erweiterungsmethoden deklarieren, sagt Ihr Programm, dass Sie in Mscorlib nach dem Attribut suchen sollen, das durch ein [TypeForwardedTo] -Attribut in der .NET 4.5-Version des Systems aktiviert wurde. Hauptreferenz Assembly, die jedoch nicht vorhanden ist, wenn Sie Ihr Programm unter .NET 4.0 ausführen

Und natürlich hilft nichts dabei, die Verwendung von Klassen und Methoden zu beenden, die nur in .NET 4.5 verfügbar sind. Wenn Sie dies tun, schlägt Ihr Programm mit einer TypeLoadException oder MissingMethodException fehl, wenn es unter 4.0 ausgeführt wird

Nur Ziel 4.0 und alle diese Probleme verschwinden. Oder brechen Sie diesen Stau und stellen Sie die Unterstützung von XP ein, eine Geschäftsentscheidung, die Programmierer oft nicht treffen können, die sie aber sicherlich fördern können, indem sie auf die Probleme hinweisen, die sie verursachen. Natürlich sind die Kosten für die Unterstützung älterer Betriebssysteme ungleich Null. Lediglich der Testaufwand ist erheblich. Die Windows-Kompatibilität ist ein Kostenfaktor, der vom Management häufig nicht erkannt wird. Sie ist jedoch legendär, es sei denn, sie wird darauf hingewiesen. Leiten Sie diese Kosten an den Kunden weiter und er trifft die richtige Entscheidung viel schneller :) Aber wir können Ihnen dabei nicht helfen.

184
Hans Passant

Leider können Sie 4.5-Programme unter XP nicht ausführen.

Und der relevante Beitrag von dieser Connect-Seite:

Gepostet von Microsoft am 23/03/2012 um 10:39
Danke für den Bericht. Es handelt sich hierbei um ein beabsichtigtes Verhalten in .NET Framework 4.5 Beta. Die unterstützten Betriebssysteme sind mindestens Windows 7, Windows Server 2008 SP2 und Windows Server 2008 R2 SP1. Windows XP ist kein unterstütztes Betriebssystem für die Beta-Version.

21
Oztaco

Das Mono-Projekt hat Windows XP Unterstützung und "vergessen" erwähnt. Obwohl Windows XP SP2 ist immer noch das Minimum unterstützte Version, es ist eigentlich Windows Vista.

Die letzte Version von Mono, die Windows XP unterstützt, war 3.2.3.

7
guest

Versuchen Sie Mono:

http://www.go-mono.com/mono-downloads/download.html

Dieser Download funktioniert unter allen Versionen von Windows XP, 2003, Vista und Windows 7.

7
luiseduardohd

Die letzte Version, die Windows XP (SP3) unterstützt, ist mono-4.3.2.467-gtksharp-2.12.30.1-win32-0.msi und ersetzt .NET 4.5 nicht, könnte aber für einige von Interesse sein anwendungen.

siehe dort: https://download.mono-project.com/archive/4.3.2/windows-installer/

4
Sandy