CLR si lze ztotožnit s pojmem virtuálního stroje při použití programovacího jazyka Java. Podobně jako u programovacího jazyka Java, nejsou zdrojové kódy kompilovány přímo do nativního kódu, který lze provádět, ale do intertmediárního jazyka. U programovacího jazyka Java je výsledkem soubor s příponou CLASS a tento je pak prováděn virtuálním strojem Javy. Podobně v prostředí .NET jsou zdrojové soubory libovolného programovacího jazyka zkompilovány do intermediárního jazyka (nazvaného MSIL – Microsoft Intermediate Language). V případě, že má být taková aplikace spuštěna, systém detekuje, že jde o aplikaci v MSIL a spustí Just-In-Time kompilátor. Ten vygeneruje skutečné instrukce cílové platformy. Vše je přehledně zobrazeno na následujícím obrázku.
Jedním z hlavních cílů při vývoji .NETu je podpora různých programovacích jazyků. Důležitým prvkem CLR je podpora společného typového systému (Common Type Systém – CTS). Vedle CTS definovaném na systémové úrovni, CLR realizuje typovou bezpečnost a obecný objektově orientovaný model.
CTS je nezávislý na jazykové implementaci. Objektově orientované jazyky a přístup k tvorbě softwaru jsou již léta součástí vývojových nástrojů. Implementace se v různých prostředích ale výrazně liší. Některé programovací jazyky jsou čistě objektově orientované (například Smalltalk), jiné implementují vedle objektově orientovaných principů také některé neobjektové vlastnosti. V čistě objektově orientovaných programovacích jazycích jsou všechny datové typy představovány třídami a všechny proměnné jsou ve skutečnosti objekty. Objektovost dotažena do úplného konce je značně výhodná, ale přináší nemalou daň v podobě poklesu výkonu. Proto přidáváme čistě objektovým jazykům tzv. základní typy a množinu operací, které zlepšují výkonnost daného programovacího jazyka. Typový systém je rozdělen do dvou hlavních kategorií: hodnotové typy a referenční typy. V .NETu je vše (podobně jako v Javě) objektem. Základem každého typu je třída nazvaná System.Object. Výjimku tvoří hodnotové typy. Jak již bylo uvedeno, pro zvýšení výkonnosti jsou i do .NETu přidány některé základní typy jako různé druhy celých nebo reálných čísel. Někdy je ovšem nutné, pracovat i s těmito typy jako s objekty. .NET nám umožňuje provádět automatickou konverzi hodnotového typu na referenční. Operaci, která převod zajistí se říká Boxing. Opačnému procesu - převedení hodnotového typu na referenční - se říká Unboxing. Všechny hodnotové typy mají definovány odpovídající třídu, na kterou jsou konvertovány. Každý základní typ je reprezentován implicitně svou hodnotou, ale v případě potřeby je možné jej převést na odpovídající objekt a pracovat s ním jako s každým jiným objektově orientovaným typem. Díky tomu se daří dosáhnout požadované plné objektovosti typového systému bez zaplacení výkonnostního penále.
Jedním z nejdůležitějších požadavků kladený na společný typový systém je typová bezpečnost. Můžeme jí také chápat jako garanci, že nad definovanými typy nemohou být provedeny nepovolené operace. Typová bezpečnost odstraňuje chyby pramenící z nekontrolované manipulace s poměnými nebo pamětí. Každý objekt vytvořený v programu je striktně typový a typová je i reference, která se na něj odkazuje. Každý typ je navíc sám zodpovědný za přístupová práva ke svým členům.