2010-02-02 19 views

risposta

5

Come già accennato, l'IL nell'assembly .NET è indipendente dalla piattaforma (è ciò che implica l'impostazione Qualsiasi CPU). Il compilatore JIT (just-in-time) del runtime .NET compilerà questo codice byte indipendente dalla piattaforma in codice nativo specifico della piattaforma con l'ottimizzazione specifica per tale piattaforma. Quindi normalmente non c'è nulla di cui dovresti preoccuparti.

Tuttavia, se si imposta esplicitamente il progetto da compilare con x64 come target della piattaforma, l'assembly non verrà più eseguito su un runtime x86 (e viceversa per x86 sull'obiettivo della piattaforma). Questo è utile solo se il tuo codice ha dipendenze da librerie native x64/x86 come componenti COM in-process.

Come ha aggiunto Rowland in un commento, l'obiettivo della piattaforma non deve essere confuso con il testimone del sistema operativo sottostante. Gli assembly .NET con x86 come piattaforma target verranno eseguiti su entrambe le versioni di Windows a 32 e 64 bit (ovvero come processo a 32 bit in modalità WOW64).

In effetti, probabilmente lo scenario più comune per utilizzare l'impostazione di destinazione della piattaforma è quando l'assembly .NET ha un riferimento a un componente COM a 32 bit. Per essere in grado di eseguire l'assembly su un sistema x64, l'assembly deve essere compilato con il flag x86. Su un sistema operativo a 64 bit e con l'impostazione Qualsiasi CPU abilitata, il runtime eseguiva l'assembly in un processo a 64 bit e il caricamento del componente COM a 32 bit nel processo a 64 bit non avrebbe avuto esito positivo. Compilando con il flag x86, il runtime .NET esegue l'assembly in un processo a 32 bit e quindi il componente COM può essere caricato in modo sicuro.

+2

x86 Le app .NET verranno eseguite su x64, ma non viceversa. –

1

Il tuo C#/VB.Net ecc. È compilato nell'IL corretto per la piattaforma, sia x86, x64 o qualsiasi altra cosa. Non ci sono costanti separati nella lingua per dirigere il codice su entrambi i percorsi, quindi la risposta è no.

2

Non "ottimizza" l'app per piattaforme a 64 bit. Gli assembly .NET conterranno IL che è indipendente dalla piattaforma per definizione indipendentemente da tale impostazione. Quella impostazione semplicemente capovolge un flag nell'assieme di destinazione e lo fa girare sulla versione specifica del runtime.

+0

@Mehrdad E se non si imposta questo flag, verrà eseguito sulla versione errata del runtime? E perderà qualche prestazione? –

+2

@Jader: AnyCPU caricherà il runtime a 64 bit su OS a 64 bit e runtime a 32 bit su sistema operativo a 32 bit (o qualunque sia il processo principale in esecuzione, se viene caricato in un processo). x86 lo costringerà a girare a 32 bit CLR anche in un sistema operativo a 64 bit (in modalità WOW64). Vedi http://msdn.microsoft.com/en-us/library/zekwfyz4(VS.80).aspx per maggiori dettagli. –

+0

Il codice IL stesso non è ottimizzato per 64 bit, ma a causa del maggior numero di registri in x64, il codice nativo generato dal compilatore JIT è potenzialmente più veloce. I due compilatori JIT (x86 e x64) sono molto diversi in termini di capacità di generazione del codice.C'è un interessante blog MSDN sull'argomento della generazione del codice nativo dal codice IL: http://blogs.msdn.com/clrcodegeneration/default.aspx – Pepor

0

L'impostazione predefinita per un'applicazione .NET è Qualsiasi CPU, il che significa che gli assiemi verranno eseguiti su entrambe le piattaforme a 32 e 64 bit. Tuttavia, è possibile specificare 32 o 64 bit per richiedere un runtime a 32 o 64 bit.

Ricordare che il codice IL negli assembly viene compilato JIT quando l'applicazione viene eseguita. Quindi un qualsiasi gruppo CPU verrà eseguito su entrambi i 32 e 64 bit senza ulteriori indugi.

Problemi correlati