2010-09-22 11 views

Respuesta

15

El código administrado se ejecuta bajo la supervisión de CLR (Common Language Runtime). Esto es responsable de cosas como administración de memoria y recolección de basura.

Así que no gestionado simplemente se ejecuta fuera del contexto de la CLR. inseguro es una especie de "intermedio" gestionado y no gestionado. inseguro todavía se ejecuta bajo el CLR, pero le permitirá acceder a la memoria directamente a través de punteros.

+0

@NullUserExceptin: gracias, es realmente útil para mí – ashish

+0

¿Qué quiere decir con "contexto"? Con C++/CLI, puede mezclar código administrado y no administrado (nativo) en un ensamblado, en un proceso. – Niki

+1

Un ensamblado de C++/CLI compilado con la opción/clr: safe (modo seguro) garantiza que el código IL producido sea verificable y que sea seguro. Básicamente, el ensamblaje seguro no puede contener ninguna funcionalidad que pertenezca al bloque inseguro C#, como la aritmética del puntero. Para usar dicha funcionalidad, debe compilarse en modo puro con/clr: pure (el ensamblado de modo puro es completamente IL, pero puede enlazarse con dlls nativos, ¿no es posible enlazar estáticamente con DLL nativas en modo puro?) O mixed-mode/clr (que no solo puede vincularse con el código nativo, sino también incorporarlo al ensamblaje producido). – Protongun

3

El código no seguro en C# permite el uso de punteros. En el contexto del CLR, no hay un código no administrado en C#.

+0

Siempre he entendido código 'no administrado' como código que se ejecuta en el contexto de la CLR ... Básicamente, como las llamadas a C/C++ DLL y tal. –

+0

Estoy totalmente de acuerdo. No serás P/Invocando ninguna C# DLL, solo C/C++ como mencionaste. –

0

inseguro - Código que pueden estar fuera del subconjunto verificable de MSIL

no administrado - El código que no está gestionada por el tiempo de ejecución y por lo tanto no es visible al GC (por ejemplo una función x 86 compilado nativo sería administrado .)

de: http://forums.devx.com/archive/index.php/t-15405.html

+0

utiliza algo como pinvoke para ejecutar código no administrado en .NET – Hal

+0

Sí, pero también puede definir funciones externas con atributos DLLImport para traer y enlazar a archivos DLL nativos; una clase de identificadores de funciones externas se puede usar como un "contenedor" administrado para el código nativo. – KeithS

2

código no seguro se ejecuta dentro del CLR mientras que el código administrado por la ONU se ejecuta fuera del CLR.

Un ejemplo de código no seguro sería:

unsafe class MyClass 
{ 
    private int * intPtr; 
} 

Puede utilizar punteros en cualquier parte de esta clase.

Un ejemplo de código no administrado es:

class MyClass 
{ 
    [DllImport("someUnmanagedDll.dll")] 
    static extern int UnManagedCodeMethod(string msg, string title); 

    public static void Main() 
    { 
     UnManagedCodeMethod("calling unmanaged code", "hi"); 
    } 
} 

No es necesariamente el código no administrado en sí, sino llamándolo.

Cuestiones relacionadas