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

j'ai une certaine confusion liée aux options de construction de la 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 construction "N'importe quel CPU" et j'ai trouvé qu'ils sont les exécutables x86 (qui ne verraient pas cela venir!). Alors, y a-t-il une différence entre cibler un exécutable x86 vs "N'importe quel CPU"?

une Autre chose que j'ai remarqué, c'est que les projets c++ gérés n'ont pas cette plateforme comme option. Pourquoi est-ce? Est-ce que cela signifie que mes soupçons sur "N'importe quel exécutable CPU" étant des exécutables 32 bits simples sont justes?

433
demandé sur iliketocode 2009-02-05 19:43:26

8 réponses

An AnyCPU l'assemblage JIT à 64 bits lorsqu'il est chargé dans un 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'Assemblée (quelque chose probablement non géré) qui nécessite 32 bits ou 64 bits.

340
répondu AnthonyWJones 2017-05-03 13:49:35

je pense que la plupart des choses importantes ont été dites, mais j'ai juste pensé que je voudrais ajouter une chose: si vous compilez comme N'importe quel CPU et exécutez sur une plate-forme x64, alors vous ne serez pas en mesure de charger des dlls 32-bit, parce que votre application n'a pas été lancée dans WOW64, mais ces dlls doivent exécuter là.

si vous compilez sous x86, alors le système x64 lancera votre application dans WOW64, et vous pourrez charger des dlls 32 bits.

donc je pense que vous devriez choisir " 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 un peu:

/CLRIMAGETYPE (spécifier le Type D'Image CLR)

incidemment, cette autre documentation de Microsoft convient que x86 est habituellement un choix PLUS portable:

choisir x86 est généralement le plus sûr configuration d'un paquet app puisqu'il fonctionnera sur presque tous les appareils. Sur certains appareils, une application paquet avec la configuration x86 ne fonctionnera pas, comme la Xbox ou certains L'ido Core appareils. Cependant, pour un PC, un paquet x86 est le plus sûr choix et dispose de la plus grande portée pour le déploiement d'appareils. Une importante une partie des périphériques Windows 10 continue d'exécuter la version x86 de Windows.

271
répondu Paul A Jungwirth 2018-07-16 20:45:45

Voici une aperçu rapide qui explique les différents objectifs.

de par ma propre expérience, si vous cherchez à construire un projet qui fonctionnera à la fois 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 DLLs qui se heurtent ou un 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 application x86 pure et veillera à ce que tout se déroule en douceur.

50
répondu Dillie-O 2018-06-04 19:42:32

consultez l'article Visual Studio .Net plateforme Target Explained .

le paramètre par défaut, "N'importe quel CPU", signifie que l'assemblage s'exécute native sur le CPU sur lequel il est actuellement en cours d'exécution. Sens, il sera exécuté comme 64 bits sur une machine 64 bits et 32 bits sur une machine 32 bits. Si l' l'assemblée est appelée à partir d'une application 64 bits, il fonctionnera comme un Assemblage 64 bits et ainsi de suite.

le lien ci-dessus a été signalé pour être cassé, donc voici un autre article avec une explication similaire: ce que AnyCPU signifie Vraiment En tant que .NET 4.5 et Visual Studio 11

44
répondu NYSystemsAnalyst 2017-12-11 13:41:07

"tout CPU" signifie que lorsque le programme est lancé, le Framework .NET va déterminer, en fonction de la bitness du système D'exploitation, 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 CPU : sur un système x64, votre exécutable compilé pour X86 sera exécuté en tant qu'exécutable 32 bits.

autant que vous le soupçonniez, allez à la ligne de commande de Visual Studio 2008 et courez la suite.

dumpbin YourProgram.exe /headers

il vous dira la bitness de votre programme, plus beaucoup plus.

39
répondu AngryHacker 2012-02-07 21:33:02

tout CPU signifie qu'il fonctionnera sur n'importe quelle plate-forme. C'est parce que le code géré est similaire à Java. Pensez - y comme étant compilé dans un code octet qui est interprété par le Framework .NET à l'exécution.

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

31
répondu Adam Tegen 2009-02-05 17:16:11
"151900920 de Crédit" à livre "CLR via C#", voir ceci:

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

enter image description here

22
répondu Ivan 2017-01-20 14:35:57

je vous recommande la lecture de ce après.

Lorsqu'on utilise AnyCPU, la sémantique est la suivante:

  • si le processus fonctionne sur un système Windows 32 bits, il fonctionne comme un processus 32 bits. IL est compilé en code machine x86.
  • si le processus fonctionne sur un système Windows 64 bits, il fonctionne comme un processus 32 bits. IL est compilé en code machine x86.
  • si la le processus fonctionne sur un système Windows ARM, il fonctionne comme un processus 32 bits. IL est compilé en code machine ARM.
4
répondu mamczas 2017-07-07 05:55:55