¿Qué es "código administrado"?
Al trabajar con .NET, a menudo encontrará el término "código administrado". En este artículo se explica qué significa el código administrado y se proporciona información adicional sobre él.
Para ponerlo simplemente, el código administrado es solo eso: código cuya ejecución está administrada por un entorno de ejecución. En este caso, el tiempo de ejecución en cuestión se denomina Common Language Runtime o CLR, independientemente de la implementación (por ejemplo, Mono, .NET Framework o .NET Core/.NET 5+). CLR se encarga de tomar el código administrado, compilarlo en código de máquina y, a continuación, ejecutarlo. Además, el tiempo de ejecución proporciona varios servicios importantes, como la administración automática de memoria, los límites de seguridad y la seguridad de tipos.
Contraste esto con la forma en que ejecutaría un programa de C/C++, también denominado "código no administrado". En el mundo no administrado, el programador está a cargo de casi todo. El programa real es, básicamente, un binario que el sistema operativo (SO) carga en memoria e inicia. Todo lo demás, desde la administración de memoria hasta las consideraciones de seguridad son una carga del programador.
El código administrado se escribe en uno de los lenguajes de alto nivel que se pueden ejecutar sobre .NET, como C#, Visual Basic, F# y otros. Al compilar código escrito en esos lenguajes con su compilador respectivo, no obtiene código de máquina. Se obtiene código de lenguaje intermedio, que más adelante el tiempo de ejecución compila y ejecuta. C++ es la única excepción a esta regla, ya que también puede generar archivos binarios nativos no administrados que se ejecutan en Windows.
Lenguaje intermedio y ejecución
¿Qué es "Lenguaje intermedio" (o IL para abreviar)? Es un producto de la compilación de código escrito en lenguajes .NET de alto nivel. Una vez compilado el código escrito en uno de estos lenguajes, obtendrá un binario que se compone de IL. Es importante tener en cuenta que el lenguaje intermedio es independiente de cualquier lenguaje específico que se ejecute sobre el tiempo de ejecución; incluso hay una especificación independiente para él, que puede leer si le interesa.
Una vez que produzca IL a partir de su código de alto nivel, probablemente quiera ejecutarlo. Aquí es donde CLR se encarga del proceso e inicia la compilación Just-In-Time o JIT del código IL en código máquina, que se puede ejecutar en una CPU. De esta manera, CLR sabe exactamente qué hace el código y puede administrarlo con eficacia.
A veces, el lenguaje intermedio también se denomina Lenguaje intermedio común (CIL).
Interoperabilidad de código no administrado
Por supuesto, CLR permite pasar los límites entre el mundo administrado y no administrado, y hay mucho código que lo hace, incluso en las bibliotecas de clases de .NET . Esto se denomina interoperabilidad o simplemente interop para abreviar. Estas disposiciones le permitirían, por ejemplo, encapsular una biblioteca no administrada y llamar a ella. Sin embargo, es importante tener en cuenta que, una vez hecho esto, cuando el código pasa los límites del tiempo de ejecución, la administración real de la ejecución vuelve a estar en la mano del código no administrado y, por tanto, se encuentra bajo las mismas restricciones.
De forma similar a esto, C# es un lenguaje que permite usar construcciones no administradas, como punteros directamente en el código mediante el uso de lo que se conoce como contexto no seguro, que designa un fragmento de código para el que la ejecución no está administrada por CLR.