¿Qué es el código administrado o no administrado en la programación?

150

Estoy usando un comando específico en mi código C #, que funciona bien. Sin embargo, se dice que se comportan mal en el código "no administrado".

¿Qué es el código administrado o no administrado?

Pokus
fuente

Respuestas:

75

Aquí hay un texto de MSDN sobre el código no administrado .

Algún código de biblioteca necesita llamar a código no administrado (por ejemplo, API de código nativo, como Win32). Debido a que esto significa salir del perímetro de seguridad para el código administrado, se requiere precaución.

Aquí hay otra explicación complementaria sobre el código administrado:

  • Código ejecutado por el CLR.
  • El código que se dirige al Common Language Runtime, la base de .NET Framework, se conoce como código administrado.
  • El código administrado proporciona los metadatos necesarios para que el CLR brinde servicios tales como administración de memoria, integración entre idiomas, seguridad de acceso al código y control automático de por vida de los objetos. Todo el código basado en IL se ejecuta como código administrado.
  • Código que se ejecuta bajo el entorno de ejecución de CLI.

Para su problema:

Creo que es porque NUnit ejecuta su código para UnitTesting y podría tener una parte de él que no está administrada. Pero no estoy seguro de eso, así que no tome esto por oro. Estoy seguro de que alguien podrá darle más información al respecto. ¡Espero eso ayude!

Patrick Desjardins
fuente
12
Agradezco el esfuerzo de tu respuesta. pero las personas que no saben qué es "código administrado" tendrán dificultades con lo que quiere decir en su respuesta: no sabrán: "código de biblioteca", "código no administrado", "API de código nativo", CLR, el fundación del marco .net, IL, entorno de ejecución de CLI, etc., etc.
BKSpurgeon
200

Este es un buen artículo sobre el tema.

Para resumir,

  1. El código administrado no se compila en el código de la máquina, sino en un lenguaje intermedio que es interpretado y ejecutado por algún servicio en una máquina y, por lo tanto, opera dentro de un marco seguro (¡ojalá!) Que maneja cosas peligrosas como la memoria y los subprocesos para usted. En el uso moderno, esto frecuentemente significa .NET pero no tiene que ser así.

Un programa de aplicación que se ejecuta dentro de un motor de tiempo de ejecución instalado en la misma máquina. La aplicación no puede ejecutarse sin ella. El entorno de tiempo de ejecución proporciona la biblioteca general de rutinas de software que utiliza el programa y normalmente realiza la gestión de la memoria. También puede proporcionar la conversión justo a tiempo (JIT) de código fuente a código ejecutable o de un lenguaje intermedio a código ejecutable. Java, Visual Basic y Common Language Runtime (CLR) de .NET son ejemplos de motores de tiempo de ejecución. ( Leer más )

  1. El código no administrado se compila en código máquina y, por lo tanto, el sistema operativo lo ejecuta directamente. Por lo tanto, tiene la capacidad de hacer cosas dañinas / poderosas. El código administrado no. Así es como todo solía funcionar, por lo que generalmente se asocia con cosas antiguas como .dlls.

Un programa ejecutable que se ejecuta solo. Lanzado desde el sistema operativo, el programa recurre y utiliza las rutinas de software en el sistema operativo, pero no requiere que se use otro sistema de software. Los programas en lenguaje ensamblador que se han ensamblado en lenguaje máquina y los programas C / C ++ compilados en lenguaje máquina para una plataforma en particular son ejemplos de código no administrado. ( Leer más )

  1. El código nativo a menudo es sinónimo de No administrado, pero no es idéntico.
annakata
fuente
quieres decir que en el pirateo no podemos usar el lenguaje .net (C #, C ++), ¿verdad?
Haroon A.
77
@H_wardak, ¿qué define como 'piratería'? Es un término muy general, es como decir que piratear NORAD y piratear algunos registros son lo mismo.
Alex
77
El entrevistador me preguntó una vez: ¿podemos ejecutar / escribir código no administrado en C #? ¿Alguien puede ayudarme en esto?
RSB
9
@RSB: No puede escribir código no administrado en C # (aunque puede llamar directamente a código no administrado desde C #). Teóricamente, con el compilador y el marco correctos, podría hacerlo, supongo. En la práctica, eso significa que necesitaría un compilador que pudiera compilar C # para codificar la máquina directamente. No estoy seguro de cómo funcionaría eso.
James Haug
67

Cuando piensas en no administrado , piense en códigos específicos de máquina y de nivel de máquina. Como el lenguaje ensamblador x86. El código no administrado (nativo) se compila y se vincula para ejecutarse directamente en el procesador para el que fue diseñado, excluyendo todo el sistema operativo por el momento. No es portátil, pero es rápido. Código muy simple, despojado.

Gestionado código es todo, desde Java hasta el antiguo BASIC interpretativo, o cualquier cosa que se ejecute bajo .NET. El código administrado generalmente se compila en un conjunto de instrucciones de código P o de bytes de nivel intermedio. Estas no son instrucciones específicas de la máquina, aunque se parecen al lenguaje ensamblador. El código administrado aísla el programa de la máquina en la que se está ejecutando y crea un límite seguro en el que toda la memoria se asigna indirectamente y, en general, no tiene acceso directo a los recursos de la máquina como puertos, espacio de direcciones de memoria, la pila, etc. La idea es correr en un entorno más seguro.

Para convertir de una variable administrada, por ejemplo, a una no administrada, debe llegar al objeto real. Probablemente esté envuelto o en caja en algún embalaje adicional. Las variables no administradas (como un 'int', por ejemplo), en una máquina de 32 bits, ocupa exactamente 4 bytes. No hay gastos generales o embalaje adicional. El proceso de pasar de código administrado a no administrado, y viceversa, se llama " cálculo de referencias ". Permite que sus programas crucen el límite.

TJPowell
fuente
1
Entonces, ¿cómo interactúa el mashalling con los tipos de valor y referencia? Recuerdo haber visto algo sobre MarshalByRefObject, por ejemplo.
Kyle Baran el
24

En la menor cantidad de palabras posible:

  • código administrado = programas .NET
  • código no administrado = programas "normales"
Vilx-
fuente
16
un programa .NET no es "normal"?
jtate
1
@jtate - Eso es un poco tonto, sí. :) Estaba tratando de hacerlo más intuitivo. De todos modos, eso fue hace más de 8 años. Hoy en día, con la gran cantidad de lenguajes de programación en el uso cotidiano común, esta distinción es aún más imprecisa, sí.
Vilx-
5

El código administrado es lo que crean los compiladores de C # .Net, VB.Net, F # .Net, etc. Se ejecuta en el CLR, que, entre otras cosas, ofrece servicios como recolección de basura, verificación de referencias y mucho más. Así que piense en ello, mi código es administrado por el CLR.

Por otro lado, el código no administrado compila directamente al código de la máquina. No se gestiona por CLR.

Arif
fuente
4

Básicamente, el código no administrado es un código que no se ejecuta bajo .NET CLR (es decir, no VB.NET, C #, etc.). Supongo que NUnit tiene un corredor / contenedor que no es código .NET (también conocido como C ++).

joegtp
fuente
4

Código administrado:
Código que se ejecuta bajo un "contrato de cooperación" con Common Language Runtime. El código administrado debe proporcionar los metadatos necesarios para que el tiempo de ejecución brinde servicios tales como administración de memoria, integración entre idiomas, seguridad de acceso al código y control automático de por vida de los objetos. Todo el código basado en el lenguaje intermedio de Microsoft (MSIL) se ejecuta como código administrado.

Código no administrado:
Código que se crea sin tener en cuenta las convenciones y requisitos del Common Language Runtime. El código no administrado se ejecuta en el entorno de Common Language Runtime con servicios mínimos (por ejemplo, sin recolección de basura, depuración limitada, etc.).

Referencia: http://www.dotnetspider.com/forum/11612-difference-between-managed-and-unmanaged-code.aspx

GMalla
fuente
3

NUnit carga las pruebas unitarias en un AppDomain separado, y supongo que no se llama al punto de entrada (probablemente no sea necesario), por lo tanto, el ensamblado de entrada es nulo.

leppie
fuente
2

El código administrado se ejecuta dentro del entorno de CLR, es decir .NET runtime. En resumen, todos los IL son código administrado. Pero si está utilizando algún componente de software de terceros VB6 o VC ++, estos son código no administrado ya que .NET runtime (CLR) no tiene control sobre la ejecución del código fuente del lenguaje.

chirag Makwana
fuente
1

Código administrado: código que forma MSIL (lenguaje intermedio) se desarrolla después de la compilación del compilador del lenguaje y se ejecuta directamente por el CLRcódigo administrado llamado. por ejemplo: - Todos los 61 códigos de idioma compatibles con .net framework

Código no administrado: código que se desarrolló antes .netpara el cual el formulario MSIL no está disponible y se ejecuta CLRdirectamente, sino que CLRlo redireccionará al sistema operativo, esto se conoce como código no administrado.

por ejemplo: -COM, API Win32

Ashok Narwal
fuente
Hay una serie de errores en esta publicación. Obviamente MISL (te refieres a MSIL).
Matt Seymour
1
  • Código administrado : código escrito en lenguaje .NET como C #, VB.NET.
  • Código no administrado : código no escrito en lenguaje .NET y MSIL no entiende lo que es y no puede ejecutarse bajo CLR; como los controles de terceros que utilizamos en nuestras aplicaciones .NET que no se crean en los lenguajes .NET.
Saket Kumar
fuente
0

En primer lugar, comprenda que esto, antes .NET framework, Microsoftproporcionaba productos independientes como MFC (Visual C++), VB, FoxProetc.

En 2002, Microsoft combinó sus productos e hizo .NET Framework. Ahora hay una diferencia entre cómo se ejecutó el código anteriormente y cómo se administra y ejecuta el código en .NET Framework. Microsoft introdujo el concepto de CLR.NET Framework que compila el código proveniente de cualquier lanugague compatible de .NET framework y proporciona funcionalidades adicionales como memory mangement, garbage collectionetc. Pero, tales características CLR no estaban disponibles directamente antes.

Entonces, si está creando una biblioteca / código en .NET framework (compilado con CLR), eso se llama Managed code. Puede usar esta biblioteca aún más en otras aplicaciones / proyectos .NET, y allí también, CLR comprenderá cómo se compiló antes, y es por eso que sigue siendo su código de administración.

OTOH si desea usar las bibliotecas que se escribieron antes de .NET framework, puede hacerlo con ciertas limitaciones, pero recuerde, ya que CLR no estaba allí en ese momento, por lo que ahora CLR no comprenderá y compilará este código nuevamente . Y esto se llamará unmanaged code. Tenga en cuenta que las bibliotecas / conjuntos creados por terceros para proporcionar ciertas funciones / herramientas también pueden considerarse como código no administrado si no es compatible con CLR.

En términos simples, Administrar código es algo que su CLR entiende y puede compilar por sí solo para su posterior ejecución. En .NET framework, (desde cualquier lenguaje que funcione en .NET framework) Cuando el código va a CLR, el código proporciona cierta información de metadatos, de modo que CLR puede proporcionarle las funciones especificadas aquí . Pocos de ellos son Garbage collection, Performance improvements, cross-language integration, memory managementetc.

OTOH, el código no administrado es algo específico de la máquina y está listo para usar, no es necesario procesarlo más.

Amnesh Goel
fuente
Mucha, mucha, mucha opinión desinformada, me temo. Esto puede ser una sorpresa, pero el CLR también puede ejecutar código no administrado (generalmente escrito en C ++ / CLI). Tampoco hay ningún requisito para que el código administrado esté disponible como IL. .NET Native ha existido desde hace un tiempo, y viene con ensambles precompilados. Lo que llamó "compatible con CLR" probablemente esté destinado a ser "compatible con CLS" . El incumplimiento del cumplimiento de CLS no hace que el código administrado no sea administrado, de repente. Consumir código no administrado, a pesar de su descripción, también es bastante fácil (RCW sobre COM, P / Invoke, C ++ / CLI, etc.).
Inspectable
0

Desde Pro C # 5 y .NET 4.5 Framework:

Código administrado frente a código no administrado: Quizás el punto más importante para comprender sobre el lenguaje C # es que puede producir código que se ejecute solo dentro del tiempo de ejecución de .NET (nunca podría usar C # para construir un servidor COM nativo o un C / C ++ no administrado solicitud). Hablando oficialmente, el término utilizado para describir el código dirigido al tiempo de ejecución .NET es código administrado. La unidad binaria que contiene el código administrado se denomina ensamblaje (más detalles sobre ensamblados en solo un bit). Por el contrario, el código que no puede ser alojado directamente por el tiempo de ejecución .NET se denomina código no administrado.

arush436
fuente