Nouvelles Chroniques d'Amethyste

Penser au Sens, pas au Verbe

Ce que signifie l’option AnyCPU dans Visual Studio

Poster un commentaire

Il ne vous a pas échappé qu’il existe des systèmes 32 bits et d’autres en 64 bits. Qui plus est, une application 32 bit peut tourner dans un environnement 64 bits. Résumons quelques points essentiels:

  • Les dll 64 bits sont stockées dans c:\Windows\32
    Les dll 32 bits dans c:\Windows\SysWOW64
  • Dans un système 64 bits, un processus 32 bits lit et écrit dans c:\Program Files(x86)
  • La plupart des clefs de registres ont leur version 32 et 64 bits, cela signifie qu’une modification d’un clef 64 bits, ne sera pas vue d’une application 32 bits

WOW64 signifie Windows on Windows 64. C’est la couche qui permet à une application 32 bits de tourner dans un environnement 64 bits.

Qu’en est t’il du développement?

Une application non gérée devra toujours choisir entre une cible 32 ou 64 bits. Les applications gérées disposent d’une option AnyCPU dans Visual Studio.

2014-11-29_13-39-50

Jusqu’à .Net 4.0 cette option signifiait ceci:

  • Si le processus tourne sur un Windows 32 bits, il tourne comme un processus 32 bits. Le code IL est compilé pour une machine x86
  • Si le processus tourne sur un Windows 64 bits, il tourne comme un processus 64 bits. Le code IL est compilé comme pour une machine x64
  • Si le processus tourne sur un système Windows Itanium, il tourne comme un processus 64 bits. Le code IL est compilé comme pour une machine Itanium

Remarquons tout de même que Windows Server 2008 R2 est le dernier système Windows à supporter Itanium. Vous allez donc pas en rencontrer souvent!

Jusqu’à Visual Studio 2010, AnyCPU était l’option par défaut de tous les projets .Net.
Ce qui peut poser problème. Par exemple une application dépend d’une librairie non gérée 32 bits. Sur un système 64 bits, elle va tourner donc en mode x64. Pour peu que la dll n’existe pas en version 64 bits, l’application ne sera pas en mesure de la charger.

Dans VS 2010, le mode par défaut est x86.

 

Avec l’arrivée de .Net 4.5 et VS 2012, les lignes ont encore changées et l’option par défaut est redevenue AnyCPU. Mais la sémantique a elle aussi évoluée avec l’apparition d’une option Prefer 32-bit qui est la nouvelle option par défaut:

2014-11-29_14-02-30

Uniquement active avec AnyCU:

2014-11-29_14-03-21

Ainsi:

  • Si le processus tourne sur un Windows 32 bits, il tourne comme un processus 32 bits. Le code IL est compilé pour une machine x86
  • Si le processus tourne sur un Windows 64 bits, il tourne comme un processus 64 bits. Le code IL est compilé comme pour une machine x64
  • Si le processus tourne sur un système ARM, il tourne comme un processus 32 bits. Le code IL est compilé comme pour une machine ARM

Et Prefer 32-bit?

Une application Prefer 32-bit tourne aussi bien en ARM qu’en 32 bits, mais une application 32 bits ne tourne pas en ARM.

Avec VS 2013 on observe ceci:

2014-11-29_15-26-55

L’option n’est plus active. Il y a en réalité un bug car contrairement à ce que suggère l’affichage, Prefer 32-bit est en réalité sélectionné.

Publicités

Laisser un commentaire

Entrez vos coordonnées ci-dessous ou cliquez sur une icône pour vous connecter:

Logo WordPress.com

Vous commentez à l'aide de votre compte WordPress.com. Déconnexion / Changer )

Image Twitter

Vous commentez à l'aide de votre compte Twitter. Déconnexion / Changer )

Photo Facebook

Vous commentez à l'aide de votre compte Facebook. Déconnexion / Changer )

Photo Google+

Vous commentez à l'aide de votre compte Google+. Déconnexion / Changer )

Connexion à %s