Uno degli aspetti più importanti della macchina virtuale .NET è la ragione per cui è chiamato il Common Language Runtime.
Tutti i linguaggi di programmazione di .NET vengono compilati con lo stesso formato bytecode che viene eseguito nella stessa macchina virtuale. Ciò consente ai programmi in cui parti diverse sono scritte in diversi linguaggi di programmazione per interagire senza problemi.
Le macchine virtuali hanno anche vantaggi in termini di prestazioni, poiché consentono la compilazione just-in-time e l'ottimizzazione just-in-time. Un comune compilatore offline può solo ottimizzare per una specifica architettura della CPU. Quando un'applicazione viene distribuita e l'utente non ha esattamente lo stesso sistema per cui è stata ottimizzata l'applicazione, avrà prestazioni leggermente peggiori di quelle possibili. Ma un compilatore JIT può controllare l'architettura quando il programma viene eseguito e sfruttare appieno le funzionalità disponibili. Inoltre, un comune ottimizzatore offline può solo fare ipotesi plausibili su quali parti di un programma vengono eseguite più spesso e quindi deve essere preferito durante l'ottimizzazione. Ma un ottimizzatore JIT può monitorare il programma mentre è in esecuzione, controllare quali rami sono utilizzati più spesso e ottimizzare il programma al volo mentre è in esecuzione.
Ma anche la Java VM può fare tutto questo. Perché allora Microsoft non ha come target la JVM? È per motivi di lavoro. Microsoft è noto per volere il maggior controllo possibile sull'intero stack su cui gira un'applicazione. Avere Sun (ora Oracle) controlla una parte importante dell'ecosistema di sviluppo del software era considerato un problema per loro. Soprattutto quando consente al software di funzionare su sistemi operativi non Microsoft! Così hanno sviluppato il loro framework .NET come competizione diretta con Java per attaccare la quota di mercato di Sun (ora Oracle).