Diferencia entre “administrado” y “no administrado”

Oigo / leo al respecto cuando hablo de .NET, por ejemplo, “código administrado” y “código no administrado“, pero no tengo idea de qué son y cuáles son sus diferencias. ¿Cuál es su diferencia, por definición? ¿Cuáles son las consecuencias de usar cualquiera de ellos? ¿Esta distinción existe en .NET / Windows solamente?

Código Administrado

El código administrado es lo que crean los comstackdores de Visual Basic .NET y C #. Se ejecuta en CLR (Common Language Runtime), que, entre otras cosas, ofrece servicios como recolección de basura, comprobación de tipos en tiempo de ejecución y verificación de referencias. Por lo tanto, piense en ello como “Mi código está administrado por 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 generar código administrado si lo desea, pero es opcional.

Código no administrado

El código no administrado se comstack directamente en el código de máquina. Entonces, según esa definición, todo el código comstackdo por los comstackdores C / C ++ tradicionales es ‘código no administrado’. Además, dado que se comstack en código máquina y no en un lenguaje intermedio, no es portátil.

Sin administración de memoria gratuita ni nada que el CLR ofrezca.

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

Como Visual C ++ se puede comstackr con código administrado o no administrado, es posible mezclar los dos 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é en Google :

#using  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; } 

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

El código administrado es una diferenciación acuñada por Microsoft para identificar el código del progtwig de computadora que requiere y solo se ejecutará bajo la “administración” de una máquina virtual Common Language Runtime (lo 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

El código administrado es el código que se escribe para apuntar a los servicios del entorno de ejecución del tiempo de ejecución administrado, como Common Language Runtime en .Net Technology.

No se puede acceder al código administrado que se ejecuta en Common Language Runtime fuera del entorno de tiempo de ejecución, ni tampoco se puede llamar directamente desde fuera del entorno de tiempo de ejecución. Se refiere a un contrato de cooperación entre el código de ejecución nativa y el tiempo de ejecución. Ofrece servicios como recolección de basura, comprobación de tipos en tiempo de ejecución, verificación de referencias, etc. Al utilizar código administrado, puede evitar muchos errores típicos de progtwigción que conducen a agujeros de seguridad y aplicaciones inestables, además, muchas tareas de progtwigción improductivas son automáticamente atendidas, tales como comprobación de seguridad de tipo, gestión de memoria, destrucción de objetos no utilizados, etc.

¿Qué es código no administrado?

El código no administrado se comstack directamente en el código de máquina y es ejecutado directamente por el sistema operativo. El código generado se ejecuta de forma nativa en el procesador host y el procesador ejecuta directamente el código generado por el comstackdor. Siempre se comstack para dirigirse a una architecture específica y solo se ejecutará en la plataforma deseada. Por lo tanto, si desea ejecutar el mismo código en una architecture diferente, tendrá que volver a comstackr el código utilizando esa architecture en particular.

Los archivos ejecutables no administrados son básicamente una imagen binaria, código x86, directamente cargados en la memoria. Este enfoque normalmente da como resultado una ejecución de código más rápida, pero el diagnóstico y la recuperación de errores pueden ser difíciles y llevar mucho tiempo en la mayoría de los casos. El progtwigdor debe ocuparse de la asignación de memoria, tipo de seguridad, etc., y esto conducirá a un código no administrado propenso a memory leaks como desbordamientos de búfer, anulaciones de puntero, etc.

Todo el código comstackdo por los comstackdores C / C ++ tradicionales son código no administrado. Los componentes COM, las interfaces ActiveX y las funciones API de Win32 son ejemplos de código no administrado. El código administrado es código escrito en muchos lenguajes de progtwigción de alto nivel que están disponibles para su uso con Microsoft .NET Framework, incluidos VB.NET, C #, J #, JScript.NET, etc. Dado que Visual C ++ se puede comstackr en código administrado o no administrado es posible mezclar los dos en la misma aplicación.