Differenza tra "gestito" e "non gestito"


138

Ne sento parlare / leggere a volte quando parlo di .NET, ad esempio "codice gestito" e "codice non gestito", ma non ho idea di cosa siano e quali siano le loro differenze. Quali sono le loro differenze, per definizione? Quali sono le conseguenze dell'uso di uno di essi? Questa distinzione esiste solo in .NET / Windows?


Risposte:


190

Codice gestito

Il codice gestito è ciò che creano i compilatori di Visual Basic .NET e C #. Funziona sul CLR (Common Language Runtime), che, tra le altre cose, offre servizi come garbage collection, verifica del tipo di runtime e verifica dei riferimenti. Quindi, pensalo come "Il mio codice è gestito dal CLR".

Visual Basic e C # possono produrre solo codice gestito, quindi, se stai scrivendo un'applicazione in una di quelle lingue, stai scrivendo un'applicazione gestita dal CLR. Se stai scrivendo un'applicazione in Visual C ++ .NET puoi produrre codice gestito se vuoi, ma è facoltativo.

Codice non gestito

Il codice non gestito viene compilato direttamente nel codice macchina. Quindi, secondo questa definizione, tutto il codice compilato dai compilatori C / C ++ tradizionali è "codice non gestito". Inoltre, poiché si compila in codice macchina e non in una lingua intermedia, non è portatile.

Nessuna gestione libera della memoria o qualsiasi altra cosa fornita dal CLR.

Poiché non è possibile creare codice non gestito con Visual Basic o C #, in Visual Studio tutto il codice non gestito è scritto in C / C ++.

Mescolando i due

Poiché Visual C ++ può essere compilato in codice gestito o non gestito, è possibile mescolare i due nella stessa applicazione. Ciò confonde la linea tra i due e complica la definizione, ma vale la pena menzionarlo solo perché sai che puoi ancora avere perdite di memoria se, ad esempio, stai usando una libreria di terze parti con un codice non gestito scritto male.

Ecco un esempio che ho trovato su Google :

#using <mscorlib.dll>
using namespace System;

#include "stdio.h"

void ManagedFunction()
{
    printf("Hello, I'm managed in this section\n");
}

#pragma unmanaged
UnmanagedFunction()
{
    printf("Hello, I am unmanaged through the wonder of IJW!\n");
    ManagedFunction();
}

#pragma managed
int main()
{
    UnmanagedFunction();
    return 0;
}

11
"Poiché non è possibile creare codice non gestito con Visual Basic o C #, tutto il codice non gestito è scritto in C / C ++."? Sai, ci sono altre lingue oltre a C, C ++, C # e VB. Uso Delphi per scrivere codice non gestito. Inoltre, una differenza piuttosto visibile tra il codice gestito (.NET) e il codice non gestito (Win32), è che il primo può utilizzare tutte le funzioni .NET, mentre il secondo utilizza l'API Windows nativa.
Andreas Rejbrand,

22
I termini "gestito" e "non gestito" sono stati inventati per distinguere il codice macchina da IR. Quindi, hanno davvero un significato solo nel contesto di .NET . Il kernel di Linux si compila anche in codice non gestito, ma questo non è veramente rilevante per la discussione, vero?
Kurige,

6
Questo sta diventando fuori tema, ma il mio punto è che non hai la possibilità di scrivere codice gestito in Delphi, quindi affermare che scrivere codice non gestito in Delphi è altamente ridondante. In ogni caso, ho aggiunto "in Visual Studio" alla frase offensiva. Inoltre, grazie per l'heads up sull'errore di battitura. In qualche modo l'ho perso anche con un secondo read-through.
Kurige,

Solo per essere un pedand, è possibile scrivere un codice non gestito in C # ( noto come codice "non sicuro" )
Basic

2
@JacksonTale Java non rientra nel contesto di .NET, pertanto il concetto di gestione o non gestione non è applicabile. Vedi stackoverflow.com/questions/1326071/… per una spiegazione di come Java viene compilato.
Evan Frisch,

84

Questo è più generale di .NET e Windows. Managed è un ambiente in cui hai la gestione automatica della memoria, la garbage collection, la sicurezza dei tipi, ... unmanaged è tutto il resto. Quindi, ad esempio, .NET è un ambiente gestito e C / C ++ non è gestito.


Con questa definizione, JavaScript sarebbe anche un codice non gestito, giusto?
Hampton Terry,

@HamptonTerry Javascript ha una gestione automatica della memoria, raccolta dei rifiuti e sicurezza dei tipi ... Quindi no. Javascript è gestito.
Sancarn,

13

Il codice gestito è una differenziazione coniata da Microsoft per identificare il codice del programma per computer che richiede e verrà eseguito solo sotto la "gestione" di una macchina virtuale Common Language Runtime (risultante in Bytecode).

http://en.wikipedia.org/wiki/Managed_code

http://www.developer.com/net/cplus/article.php/2197621/Managed-Unmanaged-Native-What-Kind-of-Code-Is-This.htm


1
Sì. Per aggiungere a questa risposta, il codice gestito è il codice che scrivi normalmente in .NET (in C #, per esempio), usando le funzioni .NET. Le applicazioni Windows native che utilizzano l'API Windows nativa (scritta in qualsiasi lingua, forse C), invece, sono "non gestite".
Andreas Rejbrand,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.