Qual è lo scopo dell'impostazione "Prefer 32 bit" in Visual Studio e come funziona effettivamente?


204

Inserisci qui la descrizione dell'immagine

Non mi è chiaro come il compilatore saprà automaticamente compilare per 64 bit quando sarà necessario. Come fa a sapere quando può targetizzare con sicurezza a 32 bit?

Sono principalmente curioso di sapere come il compilatore sa quale architettura scegliere come target durante la compilazione. Analizza il codice e prende una decisione in base a ciò che trova?



Ah grazie. Non l'ho visto prima. Sono ancora curioso di sapere come il compilatore sappia automaticamente quale architettura scegliere come target. Qualche idea?
— Aaron il

Risposte:


219

Microsoft ha un post nel blog Cosa significa AnyCPU a partire da .NET 4.5 e Visual Studio 11 :

In .NET 4.5 e Visual Studio 11 il formaggio è stato spostato. L'impostazione predefinita per la maggior parte dei progetti .NET è di nuovo AnyCPU, ma ora c'è più di un significato per AnyCPU. Esiste un sottotipo aggiuntivo di AnyCPU, "Qualsiasi CPU a 32 bit preferita", che è il nuovo predefinito (nel complesso, ora ci sono cinque opzioni per l'opzione del compilatore C # / platform: x86, Itanium, x64, anycpu e anycpu32bitpreferred ). Quando si utilizza il sapore "Prefer 32 bit" di 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 viene compilato in codice macchina x86.
  • Se il processo viene eseguito su un sistema Windows a 64 bit, viene eseguito come processo a 32 bit. IL viene compilato in codice macchina x86.
  • Se il processo viene eseguito su un sistema ARM Windows, viene eseguito come processo a 32 bit. IL viene compilato in base al codice macchina ARM.

La differenza, quindi, tra "Qualsiasi CPU a 32 bit preferita" e "x86" è solo questa: un'applicazione .NET compilata per x86 non funzionerà su un sistema ARM Windows, ma un'applicazione "Qualsiasi CPU a 32 bit preferita" funzionerà correttamente.


12
+1. Inoltre, la casella di controllo "Prefer 32 bit" è abilitata solo per i progetti eseguibili .NET 4.5+.
— Lee Grissom,

12
Un altro vantaggio di anycpu32bitspreferred è che un altro .exe in esecuzione a 64 bit può caricare tale assembly.
— Bruno Martinez,

30
Personalmente penso che sia orribile che lo impostano per impostazione predefinita senza l'impostazione Strumenti per disattivarlo. Ancora peggio, non puoi cercarlo poiché non nei file csproj a meno che non sia spento! Probabilmente aggiunto a causa delle incompatibilità di Office Automation con CPU Qualsiasi su un computer x64 con la maggior parte delle persone che installano Office a 32 bit.
— Dave,

6
@BrianDavidBerman esiste, se si imposta false su 32 ma si preferisce e si imposta x64 o Any CPU su un computer a 64 bit.
— Lex Li

6
La differenza tra x86 e Any CPU 32 bit preferita è che in quest'ultimo caso il flag largeaddressaware è impostato sull'eseguibile. Ciò significa che il processo a 32 bit in esecuzione su un sistema operativo a 64 bit può utilizzare 2 GB di memoria in modalità x86 e 4 GB di memoria in qualsiasi modalità preferita di CPU a 32 bit.
— Nic,

6

Ecco una semplice risposta:

Arch. Applicazione

Nota: AnyCPU-32bitPreferred è disponibile solo in .Net versione 4.5 e successive.


2
Qual è la differenza tra "funziona come 32 bit" rispetto a funziona come "WoW64". Ho pensato WoW64 = "Windows (32 bit) su Windows64" ed era necessario per l'esecuzione di qualsiasi applicazione a 32 bit.
— Peter Cordes,

C'è una fonte per questo? Apparentemente ovunque altro mi dice che l'impostazione predefinita è anycpu32bitpreferred, che è una grande differenza per le persone che eseguono macchine Windows a 64 bit (è molto).
— Ran Sagy,

@RanSagy puoi semplicemente testarlo creando un nuovo progetto e controllando Project -> Properties -> Build tab -> Platform target... ma nota che AnyCPU-32bitPreferredè disponibile solo in .Net versione 4.5 e successive. Ecco perché l'impostazione predefinita è AnyCPU.
— Yousha Aleayoub il

In alcuni casi il mio era oscurato; Speravo solo che ci fosse della documentazione su cosa succede in .net 4.5+ o .net standard / core (o davvero, MSBuild 16)
— Ran Sagy,

-1

Il motivo è: nel caso in cui non si desideri utilizzare più memoria con applicazioni a 64 bit. Ciò significa che se l'applicazione è AnyCPU , si desidera eseguire a 32 bit.

Per aggiungere altro, l'impostazione in Visual Studio ha come target il CLR specifico:

Visual Studio installa la versione a 32 bit del CLR su un computer x86 e sia la versione a 32 bit sia la versione a 64 bit appropriata del CLR su un computer Windows a 64 bit. (Poiché Visual Studio è un'applicazione a 32 bit, quando è installato su un sistema a 64 bit, funziona con WOW64.)

Fare riferimento all'articolo Applicazioni a 64 bit ( MSDN ).


1
Non sono sicuro che sia esatto. Come intendo, i file eseguibili .NET, indipendentemente da 32 o 64, sono ancora limitati a circa 2 GB per processo.
— JP Richardson,

1
Modificato la mia risposta. Ma non è sicuro se questo è quello che stai cercando :)
— Perù,

2
@Aaron, il compilatore imposta essenzialmente il flag per il runtime per decidere se è corretto caricare assembly (ovvero bloccare l'assembly solo x86 da caricare nel processo x64) e come avviare il processo (per il nuovo EXE) in base ai flag. Credo che IL sia lo stesso per entrambi i gusti.
— Alexei Levenkov,

1
@JPRichardson Sì, hai ragione. Ma in .net 4.5 hai la possibilità di aumentare le dimensioni. fare riferimento a MSDN
— Perù il

40
@JPRichardson, né eseguibile a 32 né 64 bit .Net limitato a 2 GB per processo - innanzitutto lo spazio degli indirizzi per processo è la limitazione del livello del sistema operativo (2/3 + GB per il processo a 32 bit e molto altro per 64 bit), la seconda versione anche a 32 bit può utilizzare più di 2 GB se il flag "LargeAddressAware" è impostato sull'eseguibile. Le uniche restrizioni da 2 GB che conosco riguardano le dimensioni di array / allocazione che sono limitate dall'intervallo Int32 (circa 2 GB).
— Alexei Levenkov,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.