Cosa significa il target Visual Studio “Any CPU”?

Ho una certa confusione legata alle opzioni di creazione della piattaforma .NET in Visual Studio 2008.

Qual è il target di compilazione “Any CPU” e quale tipo di file genera? Ho esaminato l’output eseguibile di questa build “Any CPU” e ho scoperto che sono gli eseguibili x86 (chi non lo vedrebbe arrivare!). Quindi, c’è qualche differenza tra il targeting eseguibile su x86 rispetto a “Qualsiasi CPU”?

Un’altra cosa che ho notato, è che i progetti C ++ gestiti non hanno questa piattaforma come opzione. Perché? Ciò significa che il mio sospetto riguardo agli eseguibili “Any CPU” che sono semplici a 32 bit è giusto?

Un assembly AnyCPU esegue il JIT a 64 bit del codice quando viene caricato in un processo a 64 bit e 32 bit quando viene caricato in un processo a 32 bit.

Limitando la CPU si potrebbe dire: c’è qualcosa che viene utilizzato dall’assemblaggio (qualcosa di probabile non gestito) che richiede 32 bit o 64 bit.

Penso che la maggior parte delle cose importanti siano state dette, ma ho pensato di aggiungere una cosa: se si compila come Any CPU ed eseguito su una piattaforma x64, non sarà ansible caricare DLL a 32 bit, perché la tua app non è stata avviata in WOW64, ma quelle DLL devono essere eseguite lì.
Se compilate come x86, il sistema x64 eseguirà l’app in WOW64 e sarete in grado di caricare DLL a 32 bit.
Quindi penso che dovresti scegliere “Qualsiasi CPU” se le tue dipendenze possono essere eseguite in entrambi gli ambienti, ma scegli x86 se hai dipendenze a 32 bit. Questo articolo di Microsoft lo spiega un po ‘:

/ CLRIMAGETYPE (specificare il tipo di immagine CLR)

Per inciso, questa altra documentazione Microsoft concorda sul fatto che x86 di solito è una scelta più portabile:

La scelta di x86 è generalmente la configurazione più sicura per un pacchetto di app poiché verrà eseguita su quasi tutti i dispositivi. Su alcuni dispositivi, non verrà eseguito un pacchetto di app con configurazione x86, come Xbox o alcuni dispositivi IoT Core. Tuttavia, per un PC, un pacchetto x86 è la scelta più sicura e ha la maggiore copertura per la distribuzione dei dispositivi. Una parte sostanziale dei dispositivi Windows 10 continua a eseguire la versione x86 di Windows.

Ecco una rapida panoramica che spiega i diversi obiettivi di costruzione.

Dalla mia esperienza personale, se stai cercando di build un progetto che girerà su entrambe le piattaforms x86 e x64, e non hai alcuna ottimizzazione x64 specifica, cambierei la build per dire specificamente “x86”.

La ragione di ciò è che a volte è ansible ottenere alcune DLL che si scontrano o un codice che si blocca durante l’arresto anomalo di WOW nell’ambiente x64. Specificando specificamente x86, il sistema operativo x64 tratterà l’app come una pura app x86 e si assicurerà che tutto funzioni senza intoppi.

Leggi l’articolo Spiegazione della piattaforma di Visual Studio .NET .

L’impostazione predefinita, “Qualsiasi CPU”, significa che l’assembly verrà eseguito in modo nativo sulla CPU su cui è attualmente in esecuzione. Significato, verrà eseguito come 64 bit su una macchina a 64 bit e 32 bit su una macchina a 32 bit. Se l’assembly viene chiamato da un’applicazione a 64 bit, verrà eseguito come assembly a 64 bit e così via.

Il collegamento sopra riportato è stato segnalato come non funzionante, quindi ecco un altro articolo con una spiegazione simile: Ciò che AnyCPU significa in realtà come .NET 4.5 e Visual Studio 11

“Qualsiasi CPU” significa che all’avvio del programma, .NET Framework individuerà, in base al bitness del sistema operativo, se eseguire il programma in 32 bit o 64 bit.

C’è una differenza tra x86 e Any CPU : su un sistema x64, il tuo eseguibile compilato per X86 verrà eseguito come eseguibile a 32 bit.

Per quanto riguarda i tuoi sospetti, vai alla riga di comando di Visual Studio 2008 ed esegui quanto segue.

 dumpbin YourProgram.exe /headers 

Ti dirà il testimone del tuo programma, oltre a molto altro ancora.

Qualsiasi CPU significa che funzionerà su qualsiasi piattaforma. Questo perché il codice gestito è simile a Java. Consideralo come compilato su un codice byte interpretato da .NET Framework in fase di esecuzione.

C ++ non ha questa opzione perché è compilata per codice macchina che è specifico per piattaforma.

Credito per prenotare “CLR via C #”, vedere questo:

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

inserisci la descrizione dell'immagine qui

Consiglio di leggere questo post.

Quando si utilizza AnyCPU, la semantica è la seguente:

  • Se il processo viene eseguito su un sistema Windows a 32 bit, viene eseguito come processo a 32 bit. IL è compilato per codice macchina x86.
  • Se il processo viene eseguito su un sistema Windows a 64 bit, viene eseguito come processo a 32 bit. IL è compilato per codice macchina x86.
  • Se il processo viene eseguito su un sistema ARM Windows, viene eseguito come processo a 32 bit. IL è compilato in codice macchina ARM.