Diferencia entre "administrado" y "no administrado"

138

A veces escucho / leo sobre eso cuando hablo de .NET, por ejemplo, "código administrado" y "código no administrado", pero no tengo idea de cuáles son y cuáles son sus diferencias. ¿Cuáles son sus diferencias, por definición? ¿Cuáles son las consecuencias de usar cualquiera de ellos? ¿Existe esta distinción solo en .NET / Windows?

Louis Rhys
fuente

Respuestas:

190

Código administrado

El código administrado es lo que crean los compiladores de Visual Basic .NET y C #. Se ejecuta en el CLR (Common Language Runtime), que, entre otras cosas, ofrece servicios como recolección de basura, verificación de tipos en tiempo de ejecución y verificación de referencias. Entonces, piense en ello como: "Mi código está administrado por el CLR".

Visual Basic y C # solo pueden producir código administrado, por lo tanto, si está escribiendo una aplicación en uno de esos idiomas, está escribiendo una aplicación administrada por el CLR. Si está escribiendo una aplicación en Visual C ++ .NET, puede producir código administrado si lo desea, pero es opcional.

Código no administrado

El código no administrado compila directamente al código de la máquina. Entonces, según esa definición, todo el código compilado por los compiladores tradicionales de C / C ++ es 'código no administrado'. Además, dado que se compila en código máquina y no en un lenguaje intermedio, no es portátil.

Sin administración de memoria gratuita ni nada más que el CLR proporcione.

Como no puede crear código no administrado con Visual Basic o C #, en Visual Studio todo el código no administrado se escribe en C / C ++.

Mezclando los dos

Dado que Visual C ++ se puede compilar en código administrado o no administrado, es posible mezclar ambos en la misma aplicación. Esto borra la línea entre los dos y complica la definición, pero vale la pena mencionarlo para que sepa que aún puede tener pérdidas de memoria si, por ejemplo, está utilizando una biblioteca de terceros con algún código no administrado mal escrito.

Aquí hay un ejemplo que encontré buscando en Google :

#using <mscorlib.dll>
using namespace System;

#include "stdio.h"

void ManagedFunction()
{
    printf("Hello, I'm managed in this section\n");
}

#pragma unmanaged
UnmanagedFunction()
{
    printf("Hello, I am unmanaged through the wonder of IJW!\n");
    ManagedFunction();
}

#pragma managed
int main()
{
    UnmanagedFunction();
    return 0;
}
kurige
fuente
11
"Dado que no puede crear código no administrado con Visual Basic o C #, todo el código no administrado se escribe en C / C ++". Ya sabes, hay otros lenguajes que C, C ++, C # y VB. Yo uso Delphi para escribir código no administrado. Además, una diferencia bastante visible entre el código administrado (.NET) y el no administrado (Win32) es que el primero puede usar todas las funciones .NET, mientras que el segundo usa la API nativa de Windows.
Andreas Rejbrand
22
Los términos 'administrado' y 'no administrado' se inventaron para distinguir el código de máquina del IR. Por lo tanto, solo tienen significado en el contexto de .NET . El kernel de Linux también se compila en código no administrado, pero eso no es realmente relevante para la discusión, ¿verdad?
kurige
66
Esto está fuera de tema, pero mi punto es que no tiene la opción de escribir código administrado en Delphi, por lo que declarar que escribe código no administrado en Delphi es muy redundante. En cualquier caso, he agregado "en estudio visual" a la oración ofensiva. Además, gracias por el aviso sobre el error tipográfico. De alguna manera lo perdí incluso con una segunda lectura.
kurige
Solo para ser pedante, es posible escribir código no administrado en C # ( conocido como código "inseguro" )
básico el
2
@JacksonTale Java no está en el contexto de .NET, por lo tanto, el concepto de que sea administrado o no administrado no es aplicable. Consulte stackoverflow.com/questions/1326071/… para obtener una explicación de cómo se compila Java.
Evan Frisch
84

Esto es más general que .NET y Windows. Gestionado es un entorno donde tiene administración automática de memoria, recolección de basura, seguridad de tipos, ... no administrado es todo lo demás. Entonces, por ejemplo .NET es un entorno administrado y C / C ++ no está administrado.

Darin Dimitrov
fuente
Según esta definición, JavaScript también sería un código no administrado, ¿correcto?
Hampton Terry
@HamptonTerry Javascript tiene administración automática de memoria, recolección de basura y seguridad de tipos ... Entonces no. Javascript es administrado.
Sancarn
13

El código administrado es una diferenciación acuñada por Microsoft para identificar el código del programa de computadora que requiere y solo se ejecutará bajo la "administración" de una máquina virtual Common Language Runtime (que resulta en Bytecode).

http://en.wikipedia.org/wiki/Managed_code

http://www.developer.com/net/cplus/article.php/2197621/Managed-Unmanaged-Native-What-Kind-of-Code-Is-This.htm

RobertPitt
fuente
1
Si. Para agregar a esta respuesta, el código administrado es el código que escribe normalmente en .NET (en C #, por ejemplo), utilizando las funciones .NET. Las aplicaciones nativas de Windows que usan la API nativa de Windows (escritas en cualquier lenguaje, tal vez C), por otro lado, son "no administradas".
Andreas Rejbrand