Antes de começar a escrever códigos em C# é de bom tom entender o ecossitema da Microsoft suporta esta linguagem!
Antigamente, para se reescrever uma aplicação de C para VB, por exemplo, não bastava reescrever a aplicação, era necessário reescrever a biblioteca desta aplicação também. E para o caso de mudar o Sistema Operacional (SO)? Tinha que reescrever a aplicação e a biblioteca para cada SO.
Daí, começando pelo SO, a Microsoft desenvolveu uma Máquina Virtual (Virtual Machina - VM) que roda em qualquer SO (Sim, assim como Java). Dessa forma, escreveremos a aplicação para a VM e não para a máquina real (com memória RAM, processador físico.. cooler)
Dessa forma, não precisamos mais de bibliotecas e aplicações especificas para cada linguagem, podemos ter uma biblioteca e uma aplicação genérica, chamada de MSIL (Microsoft Intermediate Language), que compilará nosso código para a VM.
Em outras palavras, podemos escrever códigos em C#, VB, F# e eles serão compilados para uma aplicação escrita em MSIL que conversará com uma biblioteca MSIL. A VM conhece essa biblioteca e qualquer SO pode implementar nossa VM, sem complicações. Se quisermos ter um projeto escrito metade em C# e metade em VB, podemos, pois ambos são compilados para MSIL.
Dessa forma, temos essa hierarquia:
- Linguagens: C#, VB, F# ...
- Aplicação MSIL
- Biblioteca MSIL
- Máquina Virtual
- Sistemas Operacionais (Windows, Linux, PS4...)
Agora, basta conhecermos os nomes específicos de cada uma das hierarquias no mundo C#. A Máquina Virtual é chamada de CLR - Common Language Runtime. A Biblioteca MSIL é chamada de .NET Framework e a Aplicação MSIL é a aplicação .NET.
Num exemplo, o código escrito em C#:
Console.WriteLine("Olá mundo");
É compilado para um formato MSIL, tipo esse:
nop
ldstr "Olá mundo"
call System.Console.WriteLine
nop
ret
Toda linguagem .NET será compilada para esse mesmo formato que é excecutado pela CLR (ou VM). E agora, no momento da execução desse código a VM vai converter o MSIL em linguagem de máquina (linguagem que o processador entende - aquele mesmo da AMD ou Intel).
E daí vem mais um conceito, o Just-In-Time Compiler (ou Jitter) que significa que o compilador apenas executa código no momento que aplicação roda.. dessa forma, o CLR consegue compilar o código para o processador específico que a aplicação roda."