Czy można uruchomić aplikację .NET 4.5 na XP?

86

Najpierw przeczytałem, co następuje:

Tak więc, z ostatniego punktu, naprawdę myślę, że nie da się tego obejść, ale musiałem sprawdzić, czy uda mi się uzyskać ostateczną odpowiedź, ponieważ mój zespół chciałby zaktualizować .NET 4.0 do .NET 4.5. Musimy jednak wspierać XP.

Czy nie ma możliwości przejścia na .NET 4.5, jeśli chcemy wspierać XP?

Jedyne, o czym mógłbym pomyśleć, to stworzenie dwóch oddzielnych rozwiązań, ale wtedy bazy kodu musiałyby się różnić, gdybyśmy użyli funkcji .NET 4.5.

Dlatego szukam niesamowitego obejścia, którego nie mogłem znaleźć, a inni być może już wiedzą.

Justin Pihony
źródło
9
Nie, nie możesz. Trzymaj się 4.0, aż XP zdecydowanie umrze.
Federico Berasategui

Odpowiedzi:

188

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              // <=== here!!
               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.

Hans Passant
źródło
2
Dzięki Hans, pomyślałem, że zaszły jakieś przełomowe zmiany. Doceniam też obejście. Nie możemy na to pozwolić z powodów, które wskazałeś, ale dobrze jest wiedzieć. Może XP kiedyś zniknie na dobre…
Justin Pihony
3
just the testing effort is substantial- to właśnie sprawiło, że nasz zarząd "pozwolił porzucić wsparcie XP".
Christoph Fink,
Wiem, że to stary wpis - ale - @JustinPihony: Czy Twoja firma kiedykolwiek myślała o zainstalowaniu późniejszego systemu operacyjnego, a następnie zainstalowaniu VMWare lub Virtual Box? Na Windows 7 jest trochę za późno, ale Microsoft udostępnił wirtualną instalację Windows XP, która pozwoliła ci przełączać się między 7 i XP. Tylko myśl. :-)
Mark Manning
@MarkManning nie było pod naszą kontrolą. Był używany gdzie indziej.
Justin Pihony,
1
@JustinPihony: Ah. Hmmmmm ...... Moja jedyna inna sugestia to kluge. Przechwyć wersję systemu operacyjnego, a następnie po prostu skonfiguruj wszystkie funkcje w swoich klasach, które mają być umieszczone w tablicach (lub tablicach). Jedna macierz (lub część tablicy) powinna być przeznaczona dla XP, a druga dla nowszych systemów operacyjnych. Wtedy wszystko, czego potrzebujesz, to pewnego rodzaju zmienna globalna, która jest używana do określenia, którego zestawu użyć. Wszystkie wywołania mogą być takie same (lub wyglądać tak samo), ale jeden zestaw używa NET40_ <FUNCTION>, a inne mogą używać NET45_ <FUNCTION>. Byłoby to pośrednie wywołanie samej funkcji. Czy to ma sens?
Mark Manning,
21

Niestety nie, nie można uruchamiać programów 4.5 na XP.

I odpowiedni post z tej strony Connect:

Wysłane przez Microsoft 23/03/2012 o godzinie 10:39
Dziękujemy za raport. To zachowanie jest zgodne z projektem programu .NET Framework 4.5 Beta. Minimalne obsługiwane systemy operacyjne to Windows 7, Windows Server 2008 z dodatkiem SP2 i Windows Server 2008 R2 z dodatkiem SP1. Windows XP nie jest obsługiwanym systemem operacyjnym w wersji Beta.

Oztaco - Przywróć Monikę C.
źródło
8

Projekt Mono porzucił obsługę systemu Windows XP i „zapomniał” o tym wspomnieć. Chociaż nadal twierdzą, że Windows XP SP2 jest minimalną obsługiwaną wersją, w rzeczywistości jest to Windows Vista.

Ostatnia wersja Mono obsługująca system Windows XP to 3.2.3.

Gość
źródło
7

Spróbuj mono:

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

Ten plik do pobrania działa we wszystkich wersjach systemu Windows XP, 2003, Vista i Windows 7.

luiseduardohd
źródło
2
Mono jest wolniejszy niż .NET i chociaż ma większość funkcji .NET 4.5, brakuje mu niektórych głównych komponentów, takich jak WPF ( mono-project.com/Compatibility ). Możesz więc korzystać z obsługi Mono dla XP, jeśli zapewnia wszystko, czego potrzebujesz, a wpływ na wydajność jest w porządku. Z drugiej strony nie powinno być potrzeby tworzenia specjalnej „kompilacji Mono”, normalna kompilacja .NET 4.5 zazwyczaj działa w trybie Mono, ale aby upewnić się, że jest kompatybilna, należy przetestować ją specjalnie pod kątem Mono.
Qwertie
2
Próbowałem mono-3.12.1-gtksharp-2.12.26-win32-0.msi pod Windows XP SP3 i nie powiodło się, ponieważ „mono.exe nie jest prawidłową aplikacją Win32” . Próbowałem także mono-3.0.10-gtksharp-2.12.11-win32-0.exe, który nie powiódł się z „mono.exe - nie znaleziono punktu wejścia. Nie można znaleźć punktu wejścia procedury InterlockedCompareExchange64 w bibliotece dołączanej dynamicznie KERNEL32 .dll ” .
Cristian Ciupitu