A plataforma .NET implementa uma compilação em duas partes: primeiro, compila o programa .NET para a linguagem MSIL (linguagem intermediária da Microsoft) e depois, um outro compilador compila esse programa em MSIL em código de máquina, para uma plataforma particular.
Se eu desenvolvo um aplicativo .NET em uma plataforma Intel, por exemplo, o meu programa será compilado em MSIL e depois para código de máquina, usando instruções desse processador, correto? Se eu pego esse meu aplicativo .exe e o levo para uma plataforma AMD, por exemplo, com instruções de máquina diferente, como esse programa consegue ser executado (considerando que essa máquina tenha .NET instalado).
[quote=ViniGodoy]A compilação do MSIL para o código de máquina é feita pelo .Net Framework.
É como no Java. Você compila, um .class é gerado (MSIL). Depois, a JVM (.Net Framework) é quem efetivamente executa esse arquivo.
[/quote]
Mas, depois da geração do código MSIL, há uma segunda compilação, transformando MSIL em código nativo.
No meu raciocínio, para funcionar essa portabilidade entre plataformas, um programa deveria ser compilado apenas uma vez, gerando código MSIL. Quando ele fosse executado, que poderia ser em qualquer plataforma, seria compilado novamente (por outro compilador), gerando código para a plataforma final.
[quote=ECO2004]Mas, depois da geração do código MSIL, há uma segunda compilação, transformando MSIL em código nativo.
No meu raciocínio, para funcionar essa portabilidade entre plataformas, um programa deveria ser compilado apenas uma vez, gerando código MSIL. Quando ele fosse executado, que poderia ser em qualquer plataforma, seria compilado novamente (por outro compilador), gerando código para a plataforma final.
Não seria assim?[/quote]
É assim. A segunda compilação só ocorre depois que você clica no .exe gerado pelo .Net.
Aquele .exe ainda não é o código de máquina. Ele é só um launcher, com o código MSIL anexado.
[quote=ECO2004][quote=ViniGodoy]A compilação do MSIL para o código de máquina é feita pelo .Net Framework.
É como no Java. Você compila, um .class é gerado (MSIL). Depois, a JVM (.Net Framework) é quem efetivamente executa esse arquivo.
[/quote]
Mas, depois da geração do código MSIL, há uma segunda compilação, transformando MSIL em código nativo.
No meu raciocínio, para funcionar essa portabilidade entre plataformas, um programa deveria ser compilado apenas uma vez, gerando código MSIL. Quando ele fosse executado, que poderia ser em qualquer plataforma, seria compilado novamente (por outro compilador), gerando código para a plataforma final.
Não seria assim?[/quote]
O .NET funciona de duas formas: compilação AOT (Ahead of time), onde o código nativo é instalado via utilitário “ngen”, e compilação JIT (Just-in-time), que é o que o Java faz.
Um programa .NET pode conter assemblies que estão compiladas AOT e assemblies compiladas JIT.
O código que está na DLL é o mesmo, e é só MSIL (se não tiver código C++/CLI incorporado, é claro - e esse é o caso da maior parte das assemblies .NET).