2010-09-22 11 views

risposta

15

Il codice gestito viene eseguito sotto la supervisione del CLR (Common Language Runtime). Questo è responsabile per cose come la gestione della memoria e la garbage collection.

Quindi unmanaged funziona semplicemente al di fuori del contesto del CLR. non sicuro è una specie di "in mezzo" gestito e non gestito. non sicuro funziona ancora sotto CLR, ma ti permetterà di accedere alla memoria direttamente attraverso i puntatori.

+0

@NullUserExceptin: grazie, è davvero utile per me – ashish

+0

Cosa intendi per "contesto"? Con C++/CLI, puoi unire codice gestito e non gestito (nativo) in un unico assieme, in un unico processo. – Niki

+1

Un assembly C++/CLI compilato con l'opzione/clr: safe (modalità sicura) garantisce che il codice IL prodotto è verificabile e digita sicuro. In sostanza, l'assembly sicuro non può contenere alcuna funzionalità che potrebbe appartenere al blocco C# non sicuro, come l'aritmetica del puntatore. Per utilizzare tale funzionalità, è necessario compilare in modalità pura con/clr: pure (l'assembly in modalità pura è interamente IL, ma potrebbe collegarsi a dll nativi, il collegamento statico con DLL native in modalità pura non è possibile?) O in modalità mista/clr (che non può solo collegarsi al codice nativo ma incorporarlo nell'assemblaggio prodotto). – Protongun

3

Un codice non sicuro in C# consente l'uso di puntatori. Nel contesto di CLR, non vi è alcun codice non gestito in C#.

+0

ho sempre capito codice 'gestito' come codice che non esegue nel contesto del CLR ... Fondamentalmente come chiamate a DLL e come C/C++. –

+0

Sono assolutamente d'accordo. Non sarai P/Invocando comunque DLL C#, solo C/C++ come hai detto. –

0

Unsafe - codice che può essere al di fuori del sottoinsieme verificabile di MSIL

non gestito - Il codice che non è gestito dal runtime e non è quindi visibile al GC (ad esempio una funzione di x 86 compilato nativo sarebbe gestito .)

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

+0

si utilizza qualcosa come pinvoke per eseguire il codice non gestito in .net – Hal

+0

Sì, ma è anche possibile definire funzioni esterne con attributi DLLImport da portare e collegare a DLL native; una classe di handle di funzioni extern può essere utilizzata come "wrapper" gestito per il codice nativo. – KeithS

2

codice unsafe viene eseguito all'interno del CLR mentre il codice non-gestito corre fuori del CLR.

Un esempio di codice non sicuro sarebbe:

unsafe class MyClass 
{ 
    private int * intPtr; 
} 

È possibile utilizzare i puntatori ovunque in questa classe.

Un esempio di codice non gestito è:

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

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

Non è necessariamente il codice non gestito in sé, ma chiamandolo.

Problemi correlati