Waham się, czy zamieścić tę odpowiedź, jest to technicznie możliwe, ale w praktyce nie działa tak dobrze. Numery wersji środowiska CLR i podstawowych zestawów platformy nie zostały zmienione w 4.5. Nadal jest przeznaczona wersja 4.0.30319 środowiska CLR, a numery wersji zestawu struktury to nadal 4.0.0.0. Jedyną rzeczą, która jest charakterystyczna w manifeście zestawu, gdy patrzy się na niego za pomocą dezasemblera, takiego jak ildasm.exe, jest obecność atrybutu [TargetFramework], który mówi, że 4.5 jest potrzebne, który należałoby zmienić. Właściwie nie jest to takie proste, jest emitowane przez kompilator.
Największa różnica nie jest tak widoczna, Microsoft dokonał od dawna oczekiwanej zmiany w nagłówku wykonywalnego zestawów. Który określa, z jaką wersją systemu Windows plik wykonywalny jest zgodny. XP należy do poprzedniej generacji systemu Windows, zapoczątkowanej w systemie Windows 2000. Ich główny numer wersji to 5. Vista był początkiem obecnej generacji, głównym numerem wersji 6.
Kompilatory .NET zawsze określały minimalny numer wersji 4.00, wersja Windows NT i Windows 9x. Możesz to zobaczyć, uruchamiając dumpbin.exe / headers w zestawie. Przykładowe dane wyjściowe wyglądają następująco:
OPTIONAL HEADER VALUES
10B magic # (PE32)
...
4.00 operating system version
0.00 image version
4.00 subsystem version
0 Win32 version
...
Nowością w .NET 4.5 jest to, że kompilatory zmieniają wersję podsystemu na 6.00. Zmiana, która była przesadna w dużej mierze, ponieważ system Windows zwraca uwagę na tę liczbę, poza sprawdzeniem, czy jest wystarczająco mała. Włącza również funkcje appcompat, ponieważ zakłada, że program został napisany do pracy w starszych wersjach systemu Windows. Te cechy sprawiają kłopoty, zwłaszcza sposób, w jaki Windows przedstawia rozmiar okna w Aero, jest kłopotliwy. Przestaje kłamać o grubych granicach okna Aero, gdy widzi, że program został zaprojektowany do uruchamiania w wersji systemu Windows, która ma Aero.
Możesz zmienić ten numer wersji i ustawić go z powrotem na 4.00, uruchamiając Editbin.exe na zestawach z opcją / subsystem. Ta odpowiedź przedstawia przykładowe wydarzenie po kompilacji.
Na tym jednak kończą się dobre wieści, poważnym problemem jest to, że .NET 4.5 nie jest zbyt kompatybilny z .NET 4.0. Zdecydowanie największym problemem jest to, że klasy były przenoszone z jednego zestawu do drugiego. Przede wszystkim dotyczyło to atrybutu [Rozszerzenie]. Wcześniej w System.Core.dll został przeniesiony do Mscorlib.dll w .NET 4.5. To kaboom na XP, jeśli zadeklarujesz własne metody rozszerzające, twój program mówi, aby szukać w Mscorlib atrybutu, włączonego przez atrybut [TypeForwardedTo] w .NET 4.5 wersji zestawu referencyjnego System.Core. Ale go nie ma, gdy uruchamiasz program na .NET 4.0
I oczywiście nic nie pomaga w zaprzestaniu używania klas i metod dostępnych tylko w .NET 4.5. Gdy to zrobisz, program zakończy się niepowodzeniem z TypeLoadException lub MissingMethodException po uruchomieniu w wersji 4.0
Wystarczy ustawić cel 4.0, a wszystkie te problemy znikną. Albo przerwij ten problem i przestań wspierać XP, decyzję biznesową, której programiści często nie mogą podejmować, ale z pewnością może zachęcić, wskazując kłopoty, które powoduje. Konieczność obsługi starożytnych systemów operacyjnych wiąże się oczywiście z niezerowym kosztem, tylko wysiłek związany z testowaniem jest znaczny. Koszt, który nie jest często rozpoznawany przez kierownictwo, zgodność z systemem Windows jest legendarna, chyba że zostanie im wskazana. Prześlij ten koszt klientowi, a on zwykle podejmuje właściwą decyzję o wiele szybciej :) Ale nie możemy Ci w tym pomóc.