Pregunta

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

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

¿Fue útil?

Solución

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

  

Algunos códigos de biblioteca necesitan 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 la debida 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 en el entorno de ejecución CLI.

Para su problema:

Creo que es porque NUnit ejecuta su código para UnitTesting y podría tener alguna 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 que ayude!

Otros consejos

Este es un buen artículo sobre el tema.

Para resumir,

  1. Código administrado no está compilado en código de máquina sino en un lenguaje intermedio que es interpretado y ejecutado por algún servicio en una máquina y, por lo tanto, está operando dentro de un marco seguro (¡con suerte!) que maneja cosas peligrosas como memoria e hilos para ti. 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 software.   rutinas que el programa usa y típicamente realiza memoria   administración. También puede proporcionar conversión justo a tiempo (JIT) de   código fuente a código ejecutable o de un idioma intermedio a   código ejecutable Java, Visual Basic y Common Language Runtime de .NET   (CLR) son ejemplos de motores de tiempo de ejecución. ( Leer más )

  1. Código no administrado se compila en código máquina y, por lo tanto, el SO 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 la operación   sistema, el programa recurre y utiliza las rutinas de software en el   sistema operativo, pero no requiere otro sistema de software para ser   usado. Programas de lenguaje ensamblador que se han ensamblado en la máquina   lenguaje y programas C / C ++ compilados en lenguaje máquina para un   plataforma particular son ejemplos de código no administrado. ( Leer más )

    El código
  1. Native a menudo es sinónimo de No administrado, pero no es idéntico.

Cuando piense 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 y despojado.

El código

administrado lo abarca todo, desde Java hasta el antiguo BASIC interpretativo, o cualquier cosa que se ejecute en .NET. El código administrado generalmente se compila en un código P de nivel intermedio o un conjunto de instrucciones de código 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 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 en sí. 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 " marshaling " ;. Permite que sus programas crucen el límite.

En la menor cantidad de palabras posible:

  • código administrado = programas .NET
  • código no administrado = " normal " programas

El código básicamente 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 ++).

  

Código administrado:
  Código que se ejecuta bajo un "contrato de cooperación" con   El tiempo de ejecución del lenguaje común. El código administrado debe proporcionar los metadatos   necesario para que el tiempo de ejecución brinde servicios como memoria   gestión, 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 Microsoft   El lenguaje intermedio (MSIL) se ejecuta como código administrado.

     

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

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

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.

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 piénselo, CLR administra mi código.

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

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

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 CLR llamado código administrado. por ejemplo: - Todos los 61 códigos de idioma compatibles con .net framework

Código no administrado: - código que se desarrolló antes de .net para el que el formulario MSIL no está disponible y se ejecuta por CLR directamente en lugar de CLR redirigirá al sistema operativo, esto se conoce como código no administrado.

por ejemplo: -COM, API de Win32

  • Managed Código: código escrito en lenguaje .NET como C #, VB.NET.
  • Código
  • no administrado : código no escrito en lenguaje .NET y MSIL sí no entiendo 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.

Primero, comprenda esto, antes de que .NET framework , Microsoft proporcionaran 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 compila el código proveniente de cualquier lanugague compatible de .NET framework y proporciona funcionalidades adicionales como gestión de memoria, recolección de basura etc. Pero, tales características de CLR no estaban disponibles directamente antes.

  

Entonces, si está creando una biblioteca / código en .NET framework (compilado con   CLR) entonces eso se llama Código administrado . Puedes usar esta biblioteca   más adelante en otra aplicación / proyecto .NET, y allí también, CLR   entender cómo se compiló antes, y por eso sigue siendo su   administrar código.

OTOH si desea utilizar las bibliotecas que se escribieron antes de .NET framework, puede hacerlo con ciertas limitaciones, pero recuerde, dado que CLR no estaba allí en ese momento, entonces CLR no entenderá ni compilará Este código de nuevo. Y esto se llamará código no administrado . 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, para que CLR pueda proporcionarle las características especificadas aquí . Pocos de ellos son Recolección de basura, Mejoras de rendimiento, integración entre idiomas, gestión de memoria etc.

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

De Pro C # 5 y .NET 4.5 Framework:

  

Código administrado vs. código no administrado:   Quizás el punto más importante para entender sobre el lenguaje C # es que puede producir código que   puede ejecutarse solo dentro del tiempo de ejecución de .NET (nunca podría usar C # para construir un servidor COM nativo o un   aplicación C / C ++ no administrada). Hablando oficialmente, el término utilizado para describir el código dirigido a   El tiempo de ejecución de .NET es código administrado. La unidad binaria que contiene el código administrado se denomina ensamblado.   (Más detalles sobre los ensamblajes en un momento). Por el contrario, el código que no puede ser alojado directamente por .NET   el tiempo de ejecución se denomina código no administrado.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top