¿Qué es el "código administrado"?What is "managed code"?

Al trabajar con .NET Framework, a menudo se encontrará con el término "código administrado".When working with .NET Framework, you will often encounter the term "managed code". En este documento se explica el significado de este término y otra información relacionada.This document will explain what this term means and additional information around it.

Dicho en pocas palabras, el código administrado es simplemente eso: código cuya ejecución está administrada mediante un tiempo de ejecución.To put it very simply, managed code is just that: code whose execution is managed by a runtime. En este caso, el tiempo de ejecución en cuestión se denomina Common Language Runtime o CLR, independientemente de la implementación (Mono, .NET Framework o .NET Core).In this case, the runtime in question is called the Common Language Runtime or CLR, regardless of the implementation (Mono or .NET Framework or .NET Core). CLR se encarga de tomar el código administrado, compilarlo en código máquina y, después, ejecutarlo.CLR is in charge of taking the managed code, compiling it into machine code and then executing it. Además de eso, el tiempo de ejecución proporciona varios servicios importantes, como la administración de memoria automática, los límites de seguridad, la seguridad de los tipos, etc.On top of that, runtime provides several important services such as automatic memory management, security boundaries, type safety etc.

Compare esto con la forma en que ejecutaría un programa escrito en C/C++, también denominado "código no administrado".Contrast this to the way you would run a C/C++ program, also called "unmanaged code". En un entorno no administrado, el programador se encarga prácticamente de todo.In the unmanaged world, the programmer is in charge of pretty much everything. El programa real es, básicamente, un archivo binario que el sistema operativo (SO) carga en la memoria e inicia.The actual program is, essentially, a binary that the operating system (OS) loads into memory and starts. Todo lo demás, desde la administración de memoria hasta las consideraciones de seguridad, son responsabilidad del programador.Everything else, from memory management to security considerations are a burden of the programmer.

El código administrado se escribe en uno de los lenguajes de alto nivel que se pueden ejecutar en la plataforma .NET, como C#, Visual Basic, F# y otros.Managed code is written in one of the high-level languages that can be run on top of .NET, such as C#, Visual Basic, F# and others. Cuando se compila código escrito en estos lenguajes con su respectivo compilador, no se obtiene código máquina.When you compile code written in those languages with their respective compiler, you don’t get machine code. Se obtiene código de lenguaje intermedio, que más adelante el tiempo de ejecución compila y ejecuta.You get Intermediate Language code which the runtime then compiles and executes. C++ es la única excepción a esta regla, ya que también puede generar archivos binarios nativos y no administrados que se ejecutan en Windows.C++ is the one exception to this rule, as it can also produce native, unmanaged binaries that run on Windows.

Lenguaje intermedio y ejecuciónIntermediate Language & execution

¿Qué es el "lenguaje intermedio" (o IL)?What is "Intermediate Language" (or IL for short)? Es un producto de la compilación de código escrito en lenguajes .NET de alto nivel.It is a product of compilation of code written in high-level .NET languages. Una vez compilado el código escrito en uno de estos idiomas, se obtiene un archivo binario integrado por IL.Once you compile your code written in one of these languages, you will get a binary that is made out of IL. Es importante tener en cuenta que el IL 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.It is important to note that the IL is independent from any specific language that runs on top of the runtime; there is even a separate specification for it that you can read if you’re so inclined.

Una vez que haya producido IL a partir del código de alto nivel, lo más probable es que quiera ejecutarlo.Once you produce IL from your high-level code, you will most likely want to run it. 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.This is where the CLR takes over and starts the process of Just-In-Time compiling, or JIT-ing your code from IL to machine code that can actually be run on a CPU. De esta manera, CLR sabe exactamente qué hace el código y puede administrarlo con eficacia.In this way, the CLR knows exactly what your code is doing and can effectively manage it.

El lenguaje intermedio a veces también se denomina Lenguaje intermedio común (CIL) o Lenguaje intermedio de Microsoft (MSIL).Intermediate Language is sometimes also called Common Intermediate Language (CIL) or Microsoft Intermediate Language (MSIL).

Interoperabilidad con código no administradoUnmanaged code interoperability

Por supuesto, CLR permite traspasar los límites entre el entorno administrado y no administrado, y hay una gran cantidad de código que lo hace, incluso en bibliotecas de clases base.Of course, the CLR allows passing the boundaries between managed and unmanaged world, and there is a lot of code that does that, even in the Base Class Libraries. Esto se denomina interoperabilidad o simplemente interop para abreviar.This is called interoperability or just interop for short. Estas disposiciones permitirían, por ejemplo, encapsular una biblioteca no administrada y llamarla.These provisions would allow you to, for example, wrap up an unmanaged library and call into it. Pero 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 depender del código no administrado y, por tanto, se enfrenta a las mismas restricciones.However, it is important to note that once you do this, when the code passes the boundaries of the runtime, the actual management of the execution is again in the hand of unmanaged code, and thus falls under the same restrictions.

De modo parecido, 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 cuya ejecución no se administrada mediante CLR.Similar to this, C# is one language that allows you to use unmanaged constructs such as pointers directly in code by utilizing what is known as unsafe context which designates a piece of code for which the execution is not managed by the CLR.

Más recursosMore resources