Type Checker

Es un componente del CLR que se asegura de que las conversiones automáticas que se deban realizar durante la ejecución del programa sean válidas y estén permitidas.
En otras palabras, detecta la incompatibilidad de tipos, impidiéndonos asignar un valor de otro tipo a una variable.

Common Type System (CTS)

El Common Type System (CTS) o Sistema de Tipo Común es el mecanismo del CLR que permite
definir el modo en que los tipos serán creados y manipulados por el entorno de ejecución o el conjunto de reglas que han de seguir las definiciones de tipos de datos para que el CLR las acepte. Es decir, aunque cada lenguaje gestionado disponga de su propia sintaxis para definir tipos de datos, en el MSIL resultante de la compilación de sus códigos fuente se han de cumplir las reglas del CTS.

Gracias al CTS, desde un lenguaje como VB.NET, podemos instanciar un objeto de una clase escrita en C#; y hacer una llamada a uno de los métodos del objeto sin realizar conversiones de tipos en los parámetros del método, funcionando todo de forma transparente, además no permite definir o diseñar el modo en cómo el código de la aplicación será ejecutado, pero no se encarga directamente de su ejecución.

Common Intermediate Language (CIL)

Common Intermediate Language  (anteriormente llamado Microsoft Intermediate Language o MSIL) es el lenguaje de programación legible por humanos de más bajo nivel en el Common Language Infrastructure y en el .NET Framework. Los lenguajes del .NET Framework (C#,Visual Basic :Net)  compilan a CIL, el cual a su vez es ensamblado en bytecode.

CIL es un lenguaje ensamblador orientado a objetos, y está basado en pilas. Es ejecutado por una máquina virtual. Los lenguajes .NET principales son C#, Visual Basic .NET, C++/CLI, y J#.

CIL fue conocido originalmente como Microsoft Intermediate Language (MSIL) durante las versiones de prueba de los lenguajes .NET. Debido a la estandarización de C# y CLI, el bytecode es ahora conocido oficialmente como CIL. Debido a esto, CIL es frecuentemente llamado MSIL. Es posible ejecutar este lenguaje en plataformas GNU/Linux gracias al Proyecto Mono, que implementa una maquina virtual similar a la de .NET pero de software libre.

Durante la compilación de los lenguajes de programación .NET, el código fuente es convertido a código CIL en lugar de código maquina especifico del procesador. CIL es un conjunto de instrucciones independientes de la plataforma y CPU que puede ser ejecutado en cualquier ambiente que soporte el .NET Framework.

La compilación en tiempo de ejecución (JIT, just-in-time) involucra convertir el código CIL en código inmediatamente ejecutable por la CPU. La compilación JIT proporciona optimización especifica para la CPU, seguridad de tipos en tiempo de ejecución, y verificación de ensamblados.

Aquí os dejo el código de un hola mundo en CIL:

.assembly Hello {}
.method public static void Main() cil managed
{
     .entrypoint
     .maxstack 1
     ldstr "Hello, world!"
     call void [mscorlib]System.Console::WriteLine(string)
     ret
}

Y el código C# que generaría este ensamblado:

 class Hello
 {
     static void Main()
     {
         System.Console.WriteLine("Hello, world!");
     }
 }