557 votes

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

J'ai des doutes quant aux options de construction de la plate-forme .NET dans Visual Studio 2008.

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

Une autre chose que j'ai remarquée, c'est que les projets C++ gérés n'ont pas cette plateforme comme option. Comment cela se fait-il ? Cela signifie-t-il que mes soupçons concernant les exécutables "Any CPU", qui sont de simples exécutables 32 bits, sont fondés ?

4 votes

Une dernière chose à prendre en compte pour décider de la cible de la plateforme à utiliser : si la cible de la Projet de démarrage est Any CPU et que vous travaillez sur un système d'exploitation 64 bits, vous perdez la capacité à Modifier et poursuivre pendant le débogage. (Vous déboguez effectivement un processus 64 bits). Vous pouvez faire en sorte que le Projet de démarrage cible x86 pour contourner ce problème lors du débogage. (Les assemblages référencés à partir du projet de démarrage peuvent continuer à cibler les éléments suivants Any CPU .

10 votes

@CristiDiaconescu Avec VS2013, il est maintenant possible d'éditer et de continuer.

2 votes

Je pense qu'il faudrait préciser ici si le projet est une application ou une bibliothèque de classes, car la définition du bitness cible pour cette dernière peut avoir un impact sur sa disponibilité pour les applications consommatrices en fonction de la plate-forme. J'ai rencontré ce problème avec une x86 consommée par une bibliothèque AnyCPU où je devais définir Prefer 32-bit pour éviter une erreur de chargement.

422voto

AnthonyWJones Points 122520

Un site AnyCPU sera transformé en code 64 bits lorsqu'il sera chargé dans un processus 64 bits et en code 32 bits lorsqu'il sera chargé dans un processus 32 bits.

En limitant l'unité centrale, 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.

3 votes

Alors, comment puis-je produire un assemblage qui sera JIT vers x64 en C++ ?

56 votes

Les projets C++ sont compilés en code natif, de sorte que le compilateur JIT n'est pas impliqué ... donc, vous ne pouvez pas faire ce que vous demandez.

0 votes

Quelques informations de MS sur ce lien : msdn.microsoft.com/fr/us/library/zekwfyz4.aspx

341voto

Paul A Jungwirth Points 3580

Je pense que la plupart des choses importantes ont été dites, mais je pensais juste ajouter une chose : si vous compilez en tant que Toute unité centrale et exécuté sur une plate-forme x64, vous ne pourrez pas charger les fichiers DLL 32 bits, car votre application n'a pas été lancée en format WoW64 mais ces fichiers DLL doivent y être exécutés.

Si vous compilez en x86, le système x64 exécutera votre application en WoW64, et vous pourrez charger des fichiers DLL 32 bits.

Je pense donc que vous devriez choisir "Any CPU" si vos dépendances peuvent fonctionner dans l'un ou l'autre environnement, mais choisir x86 si vous avez des dépendances 32 bits. Cet article de Microsoft explique un peu cela :

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

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

Choisir x86 est généralement la configuration la plus sûre pour un paquetage d'applications car il fonctionnera sur presque tous les appareils. Sur certains périphériques, un paquet d'applications avec la configuration x86 ne fonctionnera pas, comme la Xbox ou certains appareils appareils IoT Core. Cependant, pour un PC, un paquet x86 est le choix le plus sûr et choix le plus sûr et a la plus grande portée pour le déploiement de périphériques. Une partie importante Une partie importante des appareils Windows 10 continue d'exécuter la version x86 de Windows.

3 votes

Peut-être pouvez-vous modifier votre réponse pour dire comment on peut déterminer si une DLL donnée est uniquement 32 bits. Pour autant que je sache, this devrait s'en rendre compte. Je pense que nous espérons des DLLs qui sont aussi "Any CPU", plutôt que seulement x86.

1 votes

+1 une distinction importante. J'ai dû utiliser une dépendance 32 bits (qui n'était pas identifiée comme telle). Je n'arrivais pas à comprendre les messages d'erreur cryptiques de l'exécution. Sur une intuition, j'ai changé la cible du processeur et cela a fonctionné, mais j'ai cherché le "pourquoi". Ce sera bien un jour, quand tout sera en 64 bits et que les problèmes d'incompatibilité sembleront aussi désuets que le sont aujourd'hui le 16 bits et le 32 bits.

4 votes

@GeraldDavis - Je suis d'accord. L'ironie est qu'il n'y a pas de raison technologique pour ne pas pouvoir mélanger les dépendances 32 bits et 64 bits (juste l'absence d'une couche d'optimisation dans le CLR) et j'ai été déçu aux premiers jours de .NET quand j'ai vu que le bit-ness était encore quelque chose à prendre en compte lors du déploiement (étant donné qu'il s'agit d'une VM / JIT, cela aurait été une occasion de fournir un peu plus de valeur ajoutée).

53voto

Dillie-O Points 16780

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 fonctionnera à la fois sur les plates-formes x86 et x64, et que vous n'avez pas d'optimisations spécifiques pour x64, je modifierais la compilation pour indiquer spécifiquement "x86".

La raison en est qu'il arrive que des fichiers DLL entrent en collision ou qu'un code provoque un plantage. 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 fonctionne sans problème.

43 votes

Ce qui peut être terrible si vous écrivez pour un environnement serveur et que vous voulez que votre application puisse utiliser plus de 2 Go de mémoire. Vous renoncez également aux optimisations JIT x64 qui pourraient un jour arriver.

0 votes

La quantité de problèmes d'exécution que j'ai rencontrés avec les compilations AnyCPU est la seule justification dont j'ai eu besoin pour ne plus l'utiliser comme option de compilation, à moins que quelqu'un n'ait explicitement demandé des binaires qui fonctionnent sur les deux systèmes. Depuis plus de 10 ans, personne n'a demandé des binaires x86 plutôt que x64 pour quoi que ce soit.

2 votes

"En spécifiant spécifiquement x86, le système d'exploitation x64 traitera l'application comme une application x86 pure et s'assurera que tout fonctionne correctement." - Désolé, je ne suis pas d'accord. x64 OS exécutera toujours votre application x86 dans un WOW64.

50voto

NYSystemsAnalyst Points 6197

Consultez l'article La cible de la plate-forme Visual Studio .NET expliquée .

Le paramètre par défaut, "N'importe quel CPU", signifie que l'assemblage fonctionnera nativement sur le CPU sur lequel il est actuellement exécuté. C'est-à-dire qu'il s'exécutera 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 une application 64 bits. 64 bits et ainsi de suite.

Le lien ci-dessus a été signalé comme étant cassé, voici donc un autre article avec une explication similaire : Ce que signifie réellement AnyCPU à partir de .NET 4.5 et Visual Studio 11

42voto

AngryHacker Points 18835

"Any CPU" signifie que lorsque le programme est lancé, le .NET Framework détermine, en fonction du bitness du système d'exploitation, s'il faut exécuter votre programme en 32 bits ou en 64 bits.

Il y a une différence entre x86 y Toute unité centrale sur un système x64, votre exécutable compilé pour X86 s'exécutera comme un exécutable 32 bits.

En ce qui concerne vos soupçons, il suffit d'aller dans la ligne de commande de Visual Studio 2008 et d'exécuter ce qui suit.

dumpbin YourProgram.exe /headers

Il vous indiquera le niveau de détail de votre programme, et bien d'autres choses encore.

8 votes

S'il est construit en "any cpu", il apparaîtra comme 32bit dans les en-têtes dumpbin.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X