Bienvenue à Blogs CodeS-SourceS Identification | Inscription | Aide

CoqBlog

.NET is good :-)
{ Blog de coq }

Actualités

Visual Studio 2012 / .NET 4.5 : le grand retour de la plateforme cible AnyCPU par défaut ?

Pas tout à fait : il y a une subtilité à connaitre pour les projets .NET 4.5.

 

Sous Visual Studio 2010, contrairement à ses prédécesseurs, certains types de projets .NET (dont Service Windows, Console, Windows Forms, WPF, ...) étaient créés en plateforme cible x86 et non plus AnyCPU, et ce quelle que soit la version du framework cible (de 2.0 à 4.0).

Pour rappel, le fonctionnement de la plateforme cible AnyCPU telle qu'elle existe depuis que le code .NET peut s'exécuter en x64 (et non pas en 32bit sous WOW64) pouvait être résumé de cette manière pour une application autonome (pour une application hébergée sous IIS les paramètres du pool entrent en jeu aussi) :

SI système x64 ET CLR x64 disponible
    ALORS démarrer l'application en x64
SINON SI système x64 ET CLR x64 non disponible ET CLR x86 disponible
    ALORS démarrer l'application en x86
SINON SI système x86 ET CLR x86 disponible
    ALORS démarrer l'application en x86
SINON
    ???

Sous Visual Studio 2010 une solution ne comportant que des projets ciblant par défaut une plateforme x86 possédait donc ce type de configuration de build :

Capture d'écran de la boite de dialogue de gestion de la configuration de build sous Visual Studio 2010 - x86

En cas d'ajout d'un projet en cible AnyCPU par défaut (un projet de type librairie par exemple), la solution se voyait ajouter une plateforme "Mixed Platforms" sous laquelle tous les projets étaient compilés :

Capture d'écran de la boite de dialogue de gestion de la configuration de build sous Visual Studio 2010 - Mixed Platforms

(Je laisse volontairement de côté ce qui se passe sur les autres plateformes de solution, ce n'est pas le sujet.)

La configuration de projet pour une cible AnyCPU est la suivante :

Capture d'écran des propriétés de build d'un projet C# - AnyCPU

Côté compilateur C#, ça donne une spécification de /platform:anycpu (la valeur par défaut).

 

 

Et sous Visual Studio 2012 ?

Avec Visual Studio 2012, la création d'un projet Console (par exemple) fait de nouveau apparaitre le terme "Any CPU" comme plateforme cible par défaut.

Prenons une solution de test à laquelle on ajoute un projet de chaque version du framework disponible (2.0, 3.0, 3.5, 4.0 et 4.5) :

Capture d'écran de la boite de dialogue de gestion de la configuration de build sous Visual Studio 2012 - AnyCPU

Vous vous attendiez à ce que ces applications démarrent en x64 sur un OS x64 disposant du CLR x64 ?
Pas tout à fait :

Capture d'écran du gestionnaire de tâches avec l'affichage de la plateforme

L'application .NET 4.5 a démarré sous le CLR 32bit, ce qui n'est pas vraiment ce que nous attendions.

L'explication de ce comportement se trouve dans les propriétés du projet .NET 4.5 :

Capture d'écran des propriétés de build du projet .NET 4.5
Et c'est coché par défaut.

Ce qui côté compilateur C# donne une spécification de /platform:anycpu32bitpreferred :

anycpu (default) compiles your assembly to run on any platform. Your application runs as a 64-bit process whenever possible and falls back to 32-bit when only that mode is available.

anycpu32bitpreferred compiles your assembly to run on any platform. Your application runs in 32-bit mode on systems that support both 64-bit and 32-bit applications. You can specify this option only for projects that target the .NET Framework 4.5.

Cette option est bien désactivée pour les projets .NET 4.0 et inférieurs :

Capture d'écran des propriétés de build du projet .NET 4.0

 

Côté détection sur les binaires finaux je ne reviendrais pas sur l'ensemble des possibilités, que nous avons vu il y a quelques temps pour les versions précédentes de .NET, nous nous contenterons d'ILSpy qui permet bien de faire la différence :

Application .NET 4.5 / AnyCPU+Prefer 32-bit :

Capture d'écran d'ILSpy, sur l'assembly .NET 4.5 / AnyCPU+Prefer 32-bit

Application .NET 4.0 / AnyCPU :

Capture d'écran d'ILSpy, sur l'assembly .NET 4.0 / AnyCPU

 

Bref, il faut le savoir.

Personnellement j'aurais préféré que sous Visual Studio la notion "32-bit preferred" soit directement dans le nom de la plateforme de projet, ce qui l'aurait rendu directement visible dans le gestionnaire de configurations de build de la solution.
J'aurais également préféré qu'une solution ne comprenant que des projets de ce type dispose d'une plateforme de solution elle aussi nommée "Any CPU 32-bit preferred", et qu'une solution comprennant les 2 types de "Any CPU" passe en plateforme de solution "Mixed Platforms".

Après c'est sûr que pour ceux qui n'auront connu que les projets .NET 4.5 sous Visual Studio 2012, c'est moins gênant.

Ce post vous a plu ? Ajoutez le dans vos favoris pour ne pas perdre de temps à le retrouver le jour où vous en aurez besoin :
Posted: samedi 29 décembre 2012 19:49 par coq

Commentaires

VANNESTE Xavier a dit :

Bonjour,

Intéressant mais je ne comprend pas trop l'idée de faire 32 de préférence, car il est clair que l'application dans ce cas ne tournera JAMAIS en 64 bits.

# janvier 7, 2013 16:39

coq a dit :

Bonjour,

Une des différences entre /platform:x86 et /platform:anycpu32bitpreferred serait que dans le dernier cas l'application pourrait démarrer sur machine ARM, si on en croit ce post : http://blogs.microsoft.co.il/blogs/sasha/archive/2012/04/04/what-anycpu-really-means-as-of-net-4-5-and-visual-studio-11.aspx

Mais je n'ai pas d'environnement pour tester, et je n'ai pas forcément réussi à confirmer cette information (de plus la documentation du compilateur C# ne parle pas explicitement de ce point).

# janvier 8, 2013 09:38
Les commentaires anonymes sont désactivés

Les 10 derniers blogs postés

- « Naviguer vers le haut » dans une librairie SharePoint par Blog de Jérémy Jeanson le 10-07-2014, 13:21

- PowerShell: Comment mixer NAGIOS et PowerShell pour le monitoring applicatif par Blog Technique de Romelard Fabrice le 10-07-2014, 11:43

- ReBUILD 2014 : les présentations par Le blog de Patrick [MVP Office 365] le 10-06-2014, 09:15

- II6 Management Compatibility présente dans Windows Server Technical Preview avec IIS8 par Blog de Jérémy Jeanson le 10-05-2014, 17:37

- Soft Restart sur Windows Server Technical Preview par Blog de Jérémy Jeanson le 10-03-2014, 19:43

- Non, le certificat public du CA n’est pas un certificat client !!! par Blog de Jérémy Jeanson le 10-03-2014, 00:08

- Windows Server Technical Preview disponible via MSDN par Blog de Jérémy Jeanson le 10-02-2014, 19:05

- Focus Sauvegardes SharePoint par Le blog de Patrick [MVP Office 365] le 10-02-2014, 13:11

- Technofolies, votre évènement numérique de l'année par Le Blog (Vert) d'Arnaud JUND le 09-26-2014, 18:40

- Xamarin : From Zero to Hero par Fathi Bellahcene le 09-24-2014, 17:35