Qui non entrerò molto nei dettagli, perché altri ne hanno già parlato molto, ma voglio chiarire alcuni punti che altre risposte non hanno spiegato bene o correttamente. Questo è in gran parte pedante, e per il 99,9999% dei casi si può solo pensare a "C# e CIL/MSIL è il codice gestito", ma ci sono alcune sottigliezze a questo.
In primo luogo, CIL/MSIL è noto come "linguaggio intermedio", il che significa che si tratta di un linguaggio di computer che viene utilizzato come passaggio intermedio tra il codice sorgente e il codice macchina finale nativo. Tuttavia, questo non è necessario essere il caso. Ho sentito parlare di progetti sperimentali in cui hanno creato una CPU che esegue CIL (o l'equivalente java chiamato Java Byte Code) direttamente senza prima convertirlo in una forma nativa (in pratica, il CIL è la forma nativa).
Il codice gestito fa riferimento al codice "gestito" da un runtime gestito di qualche tipo. Ciò significa in genere che il codice viene raccolto e ha una sorta di livello di sicurezza che impedisce cose come buffer overflow e altri tipi di problemi che possono verificarsi nel codice nativo. In .net questo è noto come Common Language Runtime (CLR)
In passato, questo era noto come "macchina virtuale" e perché l'ambiente java è chiamato JVM, anche se questo termine è ora in gran parte un termine improprio. Oggigiorno, con i compilatori JIT (Just in time), non esiste una "macchina virtuale", ma è invece un livello di codice che "avvolge" il codice compilato nativo per assicurare che non si infrangono le regole e per ripulire dopo il tuo codice. Inoltre, astrae alcune delle cose specifiche della piattaforma in modo che il CIL non debba preoccuparsi di loro.
Quindi, il codice gestito fa riferimento al concetto di codice in esecuzione in un runtime gestito. CIL è considerato codice gestito quando è in esecuzione in un runtime come l'ambiente di runtime .NET.
C# e VB.NET sono spesso considerati "lingue gestite" perché in genere vengono compilati in CIL ed eseguiti in un runtime gestito. Tuttavia, questo non deve necessariamente essere il caso (anche se seguendo la lettera della specifica, probabilmente deve essere il caso). Per esempio, ci sono compilatori che compilano C# direttamente al codice nativo senza un livello intermedio, e ci sono interpreti di runtime per C# che non compilano affatto il codice, ma piuttosto lo "interpretano" in fase di runtime.
Quindi l'essenza è che il codice gestito e CIL sono due cose diverse, ma sono correlate.
E viene ufficialmente chiamato CIL, Common Intermediate Language, come da [ECMA] (http://www.ecma-international.org/publications/standards/Ecma-335.htm) – Bob
NGEN di solito è ** non ** usato quando si compila in codice nativo, viene usato invece il compilatore JIT. E "[byte code] (http://en.wikipedia.org/wiki/Bytecode)" è ** non ** un altro nome per il codice nativo, è un altro nome per il codice gestito. – svick
In effetti, ha menzionato anche JIT e ora ha deciso di usare "native" per evitare confusione. –