Question Que signifie la cible Visual Studio "Any CPU"?


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 constaté qu'il s'agissait des exécutables x86 (qui ne verraient pas cela arriver!). 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?


425
2018-02-05 16:43


origine


Réponses:


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

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


335
2018-02-05 16:47



Je pense que la plupart des choses importantes ont été dites, mais je pensais juste ajouter une chose: Si vous compilez comme N'importe quel processeur et exécuté sur une plate-forme x64, vous ne pourrez pas charger de DLL 32 bits, car votre application n'a pas été démarrée dans WOW64, mais ces DLL doivent être exécutées.
 Si vous compilez en x86, le système x64 exécutera votre application dans WOW64, et vous pourrez charger des DLL 32 bits.
 Donc, je pense que vous devriez choisir "Any CPU" si vos dépendances peuvent s'exécuter dans l'un ou l'autre environnement, mais choisissez x86 si vous avez des dépendances 32 bits. Cet article de Microsoft explique cela un peu:

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

Incidemment, cette autre documentation Microsoft convient que x86 est généralement un choix plus portable:

Choisir x86 est généralement la configuration la plus sûre pour un package d'application   car il fonctionnera sur presque tous les appareils. Sur certains appareils, une application   package avec la configuration x86 ne fonctionnera pas, comme la Xbox ou certains   Appareils IoT Core. Cependant, pour un PC, un paquet x86 est le plus sûr   choix et a la plus grande portée pour le déploiement de périphériques. Un substantiel   partie des appareils Windows 10 continuent d'exécuter la version x86 de   Les fenêtres.


264
2018-01-23 18:01



Voici un Rapide vue d'ensemble cela explique les différentes cibles de construction.

D'après ma propre expérience, si vous cherchez à construire un projet qui fonctionnera sur les plates-formes 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 en est que, parfois, vous pouvez obtenir des DLL qui entrent en collision ou du code qui bloque 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.


50
2018-02-05 16:47



Découvrez l'article Explication de la cible de la plate-forme Visual Studio .NET.

Le paramètre par défaut, "Any CPU", signifie que l'assemblage sera exécuté   nativement sur la CPU, il est en cours d'exécution. Ce qui signifie, il va courir   64 bits sur une machine 64 bits et 32 ​​bits sur une machine 32 bits. Si la   l'assembly est appelé à partir d'une application 64 bits, il fonctionnera comme   Assemblage 64 bits et ainsi de suite.

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


44
2018-02-05 16:48



"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 N'importe quel processeur: sur un système x64, votre exécutable compilé pour X86 s'exécutera en tant qu'exécutable 32 bits.

En ce qui concerne vos soupçons, accédez à la ligne de commande de Visual Studio 2008 et exécutez les opérations suivantes.

dumpbin YourProgram.exe /headers

Il vous dira la bêtise de votre programme, et bien plus encore.


39
2018-02-05 16:48



Tout processeur signifie qu'il fonctionnera sur n'importe quelle plate-forme. Cela est dû au fait que le code managé est similaire à Java. Considérez-le comme étant compilé en un code d'octet interprété par le .NET Framework au moment de l'exécution.

C ++ n'a pas cette option car il est compilé en code machine spécifique à la plate-forme.


31
2018-02-05 17:16



Crédit pour réserver "CLR via C #", voir ceci:

https://books.google.co.uk/books?id=36tCAwAAQBAJ&pg=PT38

enter image description here


17
2018-01-20 14:35



Je recommande de lire ceci poster.

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é en code machine ARM.

4
2017-07-07 05:55