web-dev-qa-db-fra.com

Est-il possible d'exécuter une application .NET 4.5 sur XP?

Tout d'abord, j'ai lu ce qui suit:

Donc, depuis le dernier point, je pense vraiment qu'il n'y a pas d'autre solution, mais je devais voir si je pouvais obtenir une réponse définitive car mon équipe souhaitait passer de .NET 4.0 à .NET 4.5. Cependant, nous devons supporter XP.

N'y a-t-il aucune possibilité de passer à .NET 4.5 si on veut supporter XP?

La seule chose à laquelle je pouvais penser est de créer deux solutions distinctes, mais les bases de code devraient diverger si nous utilisions les fonctionnalités .NET 4.5.

Donc, je cherche une solution de contournement incroyable que je ne pouvais pas trouver et que d’autres savent peut-être déjà.

85
Justin Pihony

J'hésite à poster cette réponse, c'est techniquement possible mais cela ne fonctionne pas très bien dans la pratique. Les numéros de version du CLR et des assemblys du cadre principal n'ont pas été modifiés dans la version 4.5. Vous ciblez toujours la v4.0.30319 du CLR et les numéros de version d'assemblage du cadre sont toujours 4.0.0.0. La seule chose qui distingue le manifeste Assembly lorsque vous le regardez avec un désassembleur comme ildasm.exe est la présence d'un attribut [TargetFramework] qui indique que la version 4.5 est nécessaire et qu'il faudrait la modifier. Pas vraiment facile, il est émis par le compilateur.

La plus grande différence n’est pas visible, Microsoft a modifié depuis longtemps l’en-tête exécutable des assemblys. Ce qui spécifie avec quelle version de Windows l'exécutable est compatible. XP appartient à une génération précédente de Windows, démarrée sous Windows 2000. Leur numéro de version principal est 5. Vista était le début de la génération actuelle, la version majeure numéro 6.

Les compilateurs .NET ont toujours spécifié le numéro de version minimum à 4.00, la version de Windows NT et Windows 9x. Vous pouvez le voir en exécutant dumpbin.exe/headers sur l’Assembly. Exemple de sortie ressemble à ceci:

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

La nouveauté de .NET 4.5 est que les compilateurs modifient la version de ce sous-système en 6.00. Une modification qui était due en grande partie au fait que Windows est attentif à ce nombre, au-delà du simple fait de vérifier s'il est suffisamment petit. Il active également les fonctionnalités de appcompat puisqu'il suppose que le programme a été écrit pour fonctionner sur les anciennes versions de Windows. Ces fonctionnalités causent des problèmes, en particulier le fait que Windows se trouve face à la taille d’une fenêtre dans Aero est problématique. Il cesse de mentir au sujet des frontières grasses d'une fenêtre Aero lorsqu'il peut voir que le programme a été conçu pour s'exécuter sur une version Windows dotée de Aero.

Vous pouvez modifier ce numéro de version et le ramener à 4.00 en exécutant Editbin.exe sur vos assemblys à l’aide de l’option/subsystem. Cette réponse montre un exemple d'événement postbuild.

C’est cependant là que se termine la bonne nouvelle. Un problème important est que .NET 4.5 n’est pas très compatible avec .NET 4.0. De loin, le plus gros problème est que les classes ont été déplacées d'une Assemblée à une autre. C'est notamment le cas de l'attribut [Extension]. Précédemment dans System.Core.dll, il a été déplacé vers Mscorlib.dll dans .NET 4.5. C'est un kaboom sur XP si vous déclarez vos propres méthodes d'extension, votre programme dit de rechercher dans Mscorlib l'attribut, activé par un attribut [TypeForwardedTo] dans la version .NET 4.5 de l'assembly de référence System.Core. . Mais ce n'est pas là lorsque vous exécutez votre programme sur .NET 4.0

Et bien sûr, rien ne vous aide à cesser d'utiliser des classes et des méthodes uniquement disponibles sur .NET 4.5. Dans ce cas, votre programme échouera avec une exception TypeLoadException ou MissingMethodException lorsqu’il sera exécuté sur la version 4.0.

Juste cible 4.0 et tous ces problèmes disparaissent. Vous pouvez également mettre un terme à cette impasse et cesser de prendre en charge XP, une décision que les programmeurs ne peuvent souvent pas prendre mais qu’ils peuvent certainement encourager en signalant les tracas qu’elle cause. Bien entendu, le coût de la prise en charge de systèmes d'exploitation anciens est non nul, mais le travail de test est considérable. Coût peu connu de la direction, la compatibilité Windows est légendaire, à moins que cela ne leur soit signalé. Transmettez ces coûts au client et celui-ci aura tendance à prendre la bonne décision beaucoup plus rapidement :) Mais nous ne pouvons pas vous aider.

184
Hans Passant

Malheureusement, vous ne pouvez pas exécuter les programmes 4.5 sur XP.

Et le post pertinent de cette page Connect:

Publié par Microsoft le 23/03/2012 à 10h39
Merci pour le rapport. Ce comportement est inhérent à la conception dans la version bêta de .NET Framework 4.5. Les systèmes d'exploitation minimum pris en charge sont Windows 7, Windows Server 2008 SP2 et Windows Server 2008 R2 SP1. Windows XP n'est pas un système d'exploitation pris en charge pour la version bêta.

21
Oztaco

Le projet Mono a abandonné le support de Windows XP et "oublié" pour le mentionner. Bien qu'ils prétendent toujours que Windows XP SP2 est la version minimale prise en charge, il s'agit en fait de Windows Vista.

La dernière version de Mono à prendre en charge Windows XP était 3.2.3.

7
guest

Essayez mono:

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

Ce téléchargement fonctionne sur toutes les versions de Windows XP, 2003, Vista et Windows 7.

7
luiseduardohd

La dernière version à prendre en charge Windows XP (SP3) est mono-4.3.2.467-gtksharp-2.12.30.1-win32-0.msi et ne remplace pas .NET 4.5, mais pourrait présenter un intérêt pour certaines applications.

voir ici: https://download.mono-project.com/archive/4.3.2/windows-installer/

4
Sandy