J'ai une certaine confusion liée aux options de génération de la plate-forme .NET dans Visual Studio 2008.
Qu'est-ce que 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 version "Any CPU" et j'ai découvert qu'il s'agissait des exécutables x86 (qui ne verraient pas cela arriver!). Alors, y a-t-il une différence entre le ciblage de l'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? Est-ce que cela signifie que mes soupçons à propos des exécutables "Any CPU" sont de simples 32 bits?
.net
visual-studio-2008
build
64-bit
galets
la source
la source
Any CPU
et que vous exécutez sur un système d'exploitation 64 bits, vous perdez la possibilité de modifier et de continuer pendant le débogage. (Vous déboguez efficacement un processus 64 bits). Vous pouvez définir la cible du projet de démarragex86
pour contourner ce problème lors du débogage. (Les assemblys référencés à partir du projet de démarrage peuvent continuer à ciblerAny CPU
.x86
bibliothèque consommée par uneAnyCPU
application où je devais réglerPrefer 32-bit
pour éviter une erreur de chargement.Réponses:
Un assembly AnyCPU JIT en code 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 utilisé par l'assemblage (quelque chose qui n'est probablement pas géré) qui nécessite 32 bits ou 64 bits.
la source
Je pense que la plupart des choses importantes ont été dites, mais je pensais simplement ajouter une chose: si vous compilez en tant que CPU et que vous exécutez sur une plate-forme x64, vous ne pourrez pas charger de fichiers DLL 32 bits, car votre application n'a pas été démarrée dans WoW64 , mais ces fichiers DLL doivent y être exécutés.
Si vous compilez en tant que x86, le système x64 exécutera votre application dans 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 choisissez x86 si vous avez des dépendances 32 bits. Cet article de Microsoft l'explique un peu:
/ CLRIMAGETYPE (spécifier le type d'image CLR)
Soit dit en passant, cette autre documentation Microsoft convient que x86 est généralement un choix plus portable:
la source
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 sur les plates-formes x86 et x64, et que vous n'avez aucune optimisation x64 spécifique, je changerais la construction pour dire spécifiquement "x86".
La raison en est parfois que vous pouvez obtenir des fichiers DLL qui entrent en collision ou du code qui finit par planter 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 s'assurera que tout fonctionne correctement.
la source
Consultez l'article Explication de la cible de la plate-forme Visual Studio .NET .
Le lien ci-dessus a été signalé comme étant rompu, voici donc un autre article avec une explication similaire: ce que AnyCPU signifie vraiment en tant que .NET 4.5 et Visual Studio 11
la source
Crédit au livre "CLR via C #" , voir ceci:
la source
«N'importe quel processeur» signifie que lorsque le programme est démarré, le .NET Framework déterminera, en fonction du témoin du système d'exploitation, s'il faut exécuter votre programme en 32 bits ou 64 bits.
Il existe 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.
En ce qui concerne vos soupçons, accédez simplement à la ligne de commande Visual Studio 2008 et exécutez ce qui suit.
Il vous dira le témoin de votre programme, et bien plus encore.
la source
Tout processeur signifie qu'il fonctionnera sur n'importe quelle plate-forme. En effet, le code managé est similaire à Java. Considérez-le comme étant compilé en un code d'octet qui est 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 plateforme.
la source
Je recommande de lire ce post .
Lors de l'utilisation d' AnyCPU , la sémantique est la suivante:
la source