.net - compiler - visual studio 2017 64 bits




Que signifie la cible Visual Studio "Any CPU"? (6)

J'ai une certaine confusion liée aux options de construction de plate-forme .NET dans Visual Studio 2008.

Quelle est la cible de compilation "Any CPU" et quel type de fichiers génère-t-elle? J'ai examiné l'exécutable de sortie de cette compilation "Any CPU" et j'ai trouvé que ce sont les exécutables x86 (qui ne verraient pas ça venir!). Donc, y a-t-il une différence entre le ciblage exécutable sur x86 et "Any CPU"?

Une autre chose que j'ai remarquée, c'est que les projets C ++ gérés n'ont pas cette plate-forme en option. Pourquoi donc? Cela signifie-t-il que ma suspicion sur les exécutables «Any CPU» qui sont des exécutables 32 bits simples est correcte?


"Any CPU" signifie que lorsque le programme est démarré, le .NET Framework calculera, en fonction de la bit de l'OS, s'il faut exécuter votre programme en 32 bits ou 64 bits.

Il y a une différence entre x86 et Any CPU : sur un système x64, votre exécutable compilé pour X86 fonctionnera comme un exécutable 32 bits.

Pour ce qui est de vos soupçons, allez sur la ligne de commande de Visual Studio 2008 et exécutez ce qui suit.

dumpbin YourProgram.exe /headers

Il vous dira le bitness de votre programme, plus beaucoup plus.


Consultez l'article Visual Studio .NET Platform Target Explained .

Le paramètre par défaut, "Any CPU", signifie que l'assembly s'exécutera nativement sur le processeur en cours d'exécution. Ce qui signifie, il fonctionnera en 64 bits sur une machine 64 bits et 32 ​​bits sur une machine 32 bits. Si l'assembly est appelé à partir d'une application 64 bits, il fonctionnera comme un assembly 64 bits et ainsi de suite.

Le lien ci-dessus a été signalé être cassé, donc voici un autre article avec une explication similaire: Qu'est - ce que AnyCPU signifie vraiment à partir de .NET 4.5 et Visual Studio 11


Je pense que la plupart des choses importantes ont été dites, mais je pensais juste ajouter une chose
Si vous compilez comme Any CPU et exécutez sur une plate-forme x64, vous ne serez pas en mesure de charger des DLL 32 bits, car votre application n'a pas été démarrée dans WOW64, mais ces DLL doivent fonctionner là.
Si vous compilez en tant que x86, le système x64 exécutera votre application dans WOW64 et vous pourrez charger des dlls 32 bits.
Donc je pense que vous devriez choisir "Any CPU" si vos dépendances peuvent s'exécuter dans les deux environnements, mais choisissez x86 si vous avez des dépendances de 32 bits. Cet article de Microsoft explique cela un peu:

/ CLRIMAGETYPE (Spécifier le type d'image CLR)


Je recommande de lire ce post.

Lors de l'utilisation de AnyCPU, la sémantique est la suivante:

  • Si le processus s'exécute sur un système Windows 32 bits, il s'exécute en tant que processus 32 bits. IL est compilé en code machine x86.
  • Si le processus s'exécute sur un système Windows 64 bits, il s'exécute en tant que processus 32 bits. IL est compilé en code machine x86.
  • Si le processus s'exécute sur un système Windows ARM, il s'exécute en tant que processus 32 bits. IL est compilé avec le code machine ARM.

Un assembly AnyCPU JIT au code 64 bits lorsqu'il est chargé dans le processus 64 bits et 32 ​​bits lorsqu'il est chargé dans un processus 32 bits.

En limitant le CPU, vous diriez: Il y a quelque chose qui est utilisé par l'assembly (quelque chose probablement non géré) qui nécessite 32 bits ou 64 bits.


Voici un aperçu rapide qui explique les différentes cibles de construction.

D'après ma propre expérience, si vous cherchez à construire un projet qui s'exécutera à la fois sur des applications x86 et x64, et que vous n'avez pas d'optimisations x64 spécifiques, je changerais la construction pour dire spécifiquement "x86".

La raison de ceci est parfois que vous pouvez obtenir des DLL qui entrent en collision ou du code qui finit par s'écraser WOW dans l'environnement x64. En spécifiant spécifiquement x86, le système d'exploitation x64 traitera l'application comme une pure application x86 et s'assurera que tout se passe bien.





64bit