Ich zögere, diese Antwort zu posten, es ist eigentlich 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 zielen weiterhin auf v4.0.30319 der CLR, 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 [TargetFramework] -Attributs, das besagt, dass 4.5 benötigt wird und geändert werden müsste. Eigentlich nicht so einfach, es wird vom Compiler ausgegeben.
Der größte Unterschied ist nicht so sichtbar, Microsoft hat eine längst überfällige Änderung im ausführbaren Header der Assemblys vorgenommen. Welche gibt an, 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. Ihre Hauptversionsnummer ist 5. Vista war der Start der aktuellen Generation, Hauptversionsnummer 6.
.NET-Compiler haben immer eine Mindestversionsnummer von 4,00 angegeben, die Version von Windows NT und Windows 9x. Sie können dies sehen, indem Sie dumpbin.exe / headers in 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 alte Windows-Versionen geschrieben wurde. Diese Funktionen verursachen Probleme, insbesondere die Art und Weise, wie Windows über die Größe eines Fensters in Aero liegt, ist problematisch. Es hört auf, über den fetten Rändern eines Aero-Fensters zu lügen, wenn es sieht, dass das Programm für die Ausführung auf einer 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.
Hier endet jedoch die gute Nachricht. Ein erhebliches 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 [Erweiterung]. Zuvor wurde es in System.Core.dll in .NET 4.5 in Mscorlib.dll verschoben. Dies ist ein Kaboom unter XP, wenn Sie Ihre eigenen Erweiterungsmethoden deklarieren. Ihr Programm fordert Sie auf, in Mscorlib nach dem Attribut zu suchen, das durch ein Attribut [TypeForwardedTo] in der .NET 4.5-Version der System.Core-Referenzassembly aktiviert wird. Es ist jedoch nicht vorhanden, wenn Sie Ihr Programm unter .NET 4.0 ausführen
Und natürlich hilft Ihnen 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
Wenn Sie nur auf 4.0 abzielen, verschwinden alle diese Probleme. Oder brechen Sie diesen Stau und beenden Sie die Unterstützung von XP, eine Geschäftsentscheidung, die Programmierer nicht oft treffen können, aber sicherlich fördern können, indem sie auf die Probleme hinweisen, die sie verursachen. Die Unterstützung alter Betriebssysteme ist natürlich mit Kosten ungleich Null verbunden, nur der Testaufwand ist erheblich. Die Windows-Kompatibilität ist 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.