¿Qué es código administrado / no administrado en C #?

Estoy usando Assembly.GetEntryAssembly() … en mi código C # para obtener la versión de la aplicación. Funciona bien, pero cuando lo pruebo en NUnit, devuelve NULL . En MSDN, indica que puede devolver NULL cuando se NULL desde un código no administrado.

¿Qué es código administrado o no administrado? No lo entiendo.

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

Algunos códigos de biblioteca necesitan llamar al código no administrado (por ejemplo, API de código nativo, como Win32). Como esto significa salir del perímetro de seguridad para el código administrado, se requiere la debida precaución.

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

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

Para tu problema:

Creo que es porque NUnit ejecuta tu código para UnitTesting y puede que tenga una parte no administrada. Pero no estoy seguro, así que no tomes esto por oro. Estoy seguro de que alguien podrá darle más información al respecto. ¡Espero eso ayude!

Este es un buen artículo sobre el tema.

Hoja de cuna:

El código administrado no se comstack en código 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 (¡con suerte!) Que maneja cosas peligrosas como la memoria y los hilos por usted. En el uso moderno esto frecuentemente significa .NET pero no tiene que ser así.

El código no administrado se comstack 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 normalmente está asociado con cosas viejas como .dlls

El código nativo a menudo es sinónimo de Unmanaged, pero no es idéntico.

Cuando piense en código no administrado , específico de la máquina de pensar, a nivel de máquina. Como el lenguaje de ensamblaje x86. El código no administrado (nativo) se comstack y enlaza para ejecutarse directamente en el procesador para el que fue diseñado, excluyendo todo lo relacionado con el sistema operativo por el momento. No es portátil, pero es rápido. Muy simple, código reducido.

El código administrado es todo desde Java hasta el viejo BASIC interpretativo, o cualquier cosa que se ejecute bajo .NET. Generalmente, el código administrado se comstack en un código P de nivel intermedio o en un conjunto de instrucciones de códigos de bytes. Estas no son instrucciones específicas de la máquina, aunque se parecen al lenguaje ensamblador. El código administrado aísla el progtwig de la máquina en la que se ejecuta y crea un límite seguro en el cual toda la memoria se asigna indirectamente y, en general, no tiene acceso directo a recursos de la máquina como puertos, espacio de direcciones de memoria, la stack, etc. La idea es correr en un ambiente más seguro.

Para convertir una variable administrada, por ejemplo, en una no administrada, debe llegar al objeto real en sí. Probablemente esté envuelto o empaquetado en algún embalaje adicional. Las variables no administradas (como un ‘int’, por ejemplo) – en una máquina de 32 bits – toman exactamente 4 bytes. No hay gastos generales ni embalaje adicional. El proceso de pasar del código administrado al no administrado, y viceversa, se denomina ” clasificación “. Permite que tus progtwigs crucen el límite.

En la menor cantidad de palabras posible:

  • código administrado = progtwigs .NET
  • código no administrado = progtwigs “normales”

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

NUnit carga las pruebas unitarias en un dominio de aplicación independiente, y asumo que el punto de entrada no se está llamando (probablemente no es necesario), por lo tanto, el conjunto de entrada es nulo.

Código Administrado:
Código que se ejecuta bajo un “contrato de cooperación” con el tiempo de ejecución de lenguaje común. 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 a código y control de vida automático 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 los requisitos del tiempo de ejecución de idioma común. El código no administrado se ejecuta en el entorno de tiempo de ejecución de lenguaje común con servicios mínimos (por ejemplo, sin recolección de elementos no utilizados, depuración limitada, etc.).

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

El código administrado se ejecuta dentro del entorno de CLR, es decir, el tiempo de ejecución .NET. En resumen, todos los IL son código administrado. Pero si está utilizando un software de terceros, ejemplo VB6 o VC ++, son códigos no administrados, ya que el tiempo de ejecución .NET no tiene control sobre la ejecución del código fuente del lenguaje.

Código administrado: – Código que forma MSIL (idioma intermedio) se desarrolla después de la comstackción del comstackdor del lenguaje y ejecutado directamente por CLR llamado código administrado. por ejemplo: – Todos los 61 códigos de idioma soportados por el framework .net

Código no administrado: código desarrollado antes de .net para el cual el formulario MSIL no está disponible y CLR lo ejecuta directamente, en lugar de redirigirlo al sistema operativo, esto se conoce como código no administrado.

por ejemplo: -COM, Win32 APIs

  • Código administrado : código escrito en lenguaje .NET como C #, VB.NET.
  • Código no administrado : el código no está escrito en el lenguaje .NET y MSIL no entiende qué es y no puede ejecutarse bajo CLR; como los controles de terceros que utilizamos en nuestras aplicaciones .NET que no se crean en lenguajes .NET.

En primer lugar, comprenda esto, antes de .NET framework , Microsoft proporcionaba productos independientes como MFC (Visual C++), VB, FoxPro etc.

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

Entonces, si está creando una biblioteca / código en .NET framework (comstackdo con CLR), entonces eso se llama Managed code . Puede utilizar esta biblioteca más en otra aplicación / proyecto .NET, y allí también, CLR entenderá cómo se compiló antes, y es por eso que sigue siendo su código de administración.

OTOH si desea utilizar las bibliotecas que fueron escritas antes de .NET Framework, entonces puede hacerlo con ciertas limitaciones, pero recuerde, ya que CLR no estaba allí en ese momento, por lo que ahora, CLR no podrá entender y comstackr este código nuevamente . Y esto se llamará unmanaged code . Tenga en cuenta que las bibliotecas / ensamblajes creados por un tercero para proporcionar ciertas características / herramientas también pueden considerarse códigos no gestionados si no es compatible con CLR.

En términos sencillos, Manage Code es algo que su CLR entiende y puede comstackr por sí mismo para su posterior ejecución. En .NET Framework, (desde cualquier idioma que funcione en .NET framework) Cuando el código va a CLR, el código proporciona 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 management etc.

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

Desde Pro C # 5 y .NET 4.5 Framework:

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