O que é “código gerenciado”?

Ao trabalhar com o .NET, muitas vezes você encontrará o termo "código gerenciado". Este artigo explica o que significa código gerenciado e fornece informações adicionais sobre ele.

Em resumo, código gerenciado é exatamente isso: um código cuja execução é gerenciada por um runtime. Nesse caso, o tempo de execução 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 usar o código gerenciado, compilá-lo em código de computador e 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 tipos.

Compare isso à maneira pela qual 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 quase tudo. O programa real é, essencialmente, um binário que o sistema operacional (SO) carrega na memória e inicia. Tudo, desde o gerenciamento da memória até as considerações de segurança, é responsabilidade do programador.

O código gerenciado é escrito em uma das linguagens de alto nível que podem ser executadas sobre o .NET, como C#, Visual Basic, F# e outras. Quando você compila o código gravado nessas linguagens com seu 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. C++ é a única exceção a essa regra, já que também pode produzir binários nativos e não gerenciados que são executados no Windows.

Linguagem intermediária e execução

O que é "Linguagem Intermediária" (ou IL)? É um produto de compilação de código gravado em linguagens .NET de alto nível. Quando você compila o código gravado em uma dessas linguagens, obtém um binário composto de IL. É importante observar que a IL é independente de qualquer linguagem específica executada em runtime; há até mesmo uma especificação separada para que você pode ler se desejar.

Depois de gerar a IL do código de alto nível, execute-o. 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.

A Linguagem intermediária também é chamada CIL (Common Intermediate Language) ou MSIL (Microsoft Intermediate Language).

Interoperabilidade de código não gerenciado

Naturalmente, o CLR permite ultrapassar os limites entre o mundo gerenciado e o não gerenciado, e há muitos códigos que fazem isso, mesmo nas bibliotecas de classes do .NET. Isso é chamado de interoperabilidade ou apenas interop. Essas condições permitiriam, por exemplo, resumir uma biblioteca não gerenciada e chamá-la. 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 no código não gerenciado e, portanto, se enquadra nas mesmas restrições.

De modo semelhante, o C# é uma linguagem que permite que você use constructos não gerenciados como ponteiros diretamente no código, utilizando o que é conhecido como contexto inseguro que designa um trecho de código para o qual a execução não é gerenciada pelo CLR.

Mais recursos