O que é "código gerenciado"?
Ao trabalhar com o .NET, você geralmente encontrará o termo "código gerenciado". Este artigo explica o que significa código gerenciado e fornece informações adicionais sobre ele.
Para simplificar, o código gerenciado é apenas isso: código cuja execução é gerenciada por um runtime. Nesse caso, o runtime em questão é chamado de common language runtime ou CLR, independentemente da implementação (por exemplo, Mono, .NET Framework ou .NET Core/.NET 5+). O CLR é responsável por receber o código gerenciado, compilá-lo em código de máquina e então executá-lo. Além disso, o runtime fornece vários serviços importantes, como gerenciamento automático de memória, limites de segurança e segurança de tipo.
Contraste isso com a maneira como você executaria um programa C/C++, também chamado de "código não gerenciado". No mundo não gerenciado, o programador é responsável por praticamente tudo. O programa real é, essencialmente, um binário que o sistema operacional (SO) carrega na memória e inicia. Todo o resto, desde o gerenciamento de memória até as considerações de segurança, são um fardo do programador.
O código gerenciado é escrito em uma das linguagens de alto nível que podem ser executadas em cima do .NET, como C#, Visual Basic, F# e outros. Quando você compila o código escrito nessas linguagens com o respectivo compilador, não obtém o código do computador. Você obtém o código de Linguagem intermediária que o runtime compila e executa. O C++ é a única exceção a essa regra, pois também pode produzir binários nativos não gerenciados que são executados no Windows.
Linguagem intermediária e execução
O que é "Linguagem Intermediária" (ou IL para abreviar)? É um produto da compilação de código escrito em linguagens .NET de alto nível. Depois de compilar seu código escrito em uma dessas linguagens, você obterá um binário que é feito de IL. É importante observar que o IL é independente de qualquer linguagem específica que seja executada sobre o runtime; há até uma especificação separada para ela que você pode ler se estiver interessado.
Depois de produzir IL a partir do código de alto nível, você provavelmente desejará executá-lo. Aqui, a CLR assume e inicia o processo de compilação Just-In-Time ou colocando em compilação JIT seu código da IL no código do computador, que pode ser executado em uma CPU. Dessa forma, a CLR sabe exatamente o que o código está fazendo e pode, efetivamente, gerenciá-lo.
Às vezes, a Linguagem Intermediária também é chamada de CIL (Common Intermediate Language).
Interoperabilidade de código não gerenciado
Claro, o CLR permite passar os limites entre o mundo gerenciado e não gerenciado, e há um monte de código que faz isso, mesmo nas bibliotecas de classes do .NET . Isso é chamado de interoperabilidade ou apenas interop. Estas disposições permitiriam, por exemplo, encapsular uma biblioteca não gerenciada e fazer chamadas a ela. No entanto, é importante observar que, quando você faz isso, quando o código passa os limites do runtime, o gerenciamento real da execução está novamente na mão do código não gerenciado e, portanto, se enquadra nas mesmas restrições.
Semelhante a isso, O C# é uma linguagem que permite que você use constructos não gerenciados, como ponteiros diretamente no código, utilizando o que é conhecido como de contexto não seguro, que designa um código para o qual a execução não é gerenciada pelo CLR.