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

- SharePoint : Bug sur la gestion des permissions et la synchronisation Office par Blog Technique de Romelard Fabrice le 07-10-2014, 11:35

- SharePoint 2007 : La gestion des permissions pour les Workflows par Blog Technique de Romelard Fabrice le 07-08-2014, 11:27

- TypeMock: mock everything! par Fathi Bellahcene le 07-07-2014, 17:06

- Coding is like Read par Aurélien GALTIER le 07-01-2014, 15:30

- Mes vidéos autour des nouveautés VS 2013 par Fathi Bellahcene le 06-30-2014, 20:52

- Recherche un passionné .NET par Tkfé le 06-16-2014, 12:22

- [CodePlex] Projet KISS Workflow Foundation lancé par Blog de Jérémy Jeanson le 06-08-2014, 22:25

- Etes-vous yOS compatible ? (3/3) : la feuille de route par Le blog de Patrick [MVP SharePoint] le 06-06-2014, 00:30

- [MSDN] Utiliser l'approche Contract First avec Workflow Foundation 4.5 par Blog de Jérémy Jeanson le 06-05-2014, 21:19

- [ #ESPC14 ] TH10 Moving mountains with SharePoint ! par Le blog de Patrick [MVP SharePoint] le 06-01-2014, 11:30