Differenza tra “gestito” e “non gestito”

Ne sento / letto 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’utilizzo di entrambi? Questa distinzione esiste solo in .NET / Windows?

Codice gestito

Il codice gestito è ciò che i compilatori di Visual Basic .NET e C # creano. Funziona sul CLR (Common Language Runtime), che, tra le altre cose, offre servizi come garbage collection, controllo del tipo di run-time e controllo dei riferimenti. Quindi, pensala come, “Il mio codice è gestito dal CLR.”

Visual Basic e C # possono solo produrre codice gestito, quindi, se stai scrivendo un’applicazione in una di quelle lingue, stai scrivendo un’applicazione gestita dal CLR. Se si sta scrivendo un’applicazione in Visual C ++ .NET è ansible produrre codice gestito, se lo si desidera, ma è facoltativo.

Codice non gestito

Il codice non gestito viene compilato direttamente su codice macchina. Quindi, con questa definizione tutto il codice compilato dai compilatori C / C ++ tradizionali è “codice non gestito”. Inoltre, dal momento che si compila con il codice macchina e non con un linguaggio intermedio, non è portabile.

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

Poiché non è ansible 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 su un codice gestito o non gestito, è ansible combinare i due nella stessa applicazione. Ciò offusca la linea di demarcazione tra i due e complica la definizione, ma vale la pena menzionarla solo così sai che puoi ancora avere perdite di memoria se, per esempio, stai usando una libreria di terze parti con un codice non gestito mal scritto.

Ecco un esempio che ho trovato su google :

#using  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; } 

Questo è più generale di .NET e Windows. Gestito è un ambiente in cui si dispone di gestione automatica della memoria, garbage collection, sicurezza del tipo, … non gestito è tutto il resto. Ad esempio, .NET è un ambiente gestito e C / C ++ non gestito.

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 (con conseguente 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

Il codice gestito è il codice che viene scritto per indirizzare i servizi dell’ambiente di esecuzione runtime gestito come Common Language Runtime in .Net Technology.

Non è ansible accedere al codice gestito in esecuzione in Common Language Runtime al di fuori dell’ambiente di runtime e richiamare direttamente dall’ambiente di runtime. Si riferisce a un contratto di cooperazione tra codice in esecuzione nativo e runtime. Offre servizi come la garbage collection, il controllo del tipo di runtime, il controllo dei riferimenti ecc. Usando il codice gestito si possono evitare molti errori tipici di programmazione che portano a falle di sicurezza e applicazioni instabili, inoltre, molte attività di programmazione improduttiva vengono automaticamente prese in considerazione, ad esempio come controllo di sicurezza del tipo, gestione della memoria, distruzione di oggetti inutilizzati ecc.

Cos’è il codice non gestito?

Il codice non gestito viene compilato direttamente sul codice macchina e viene eseguito direttamente dal sistema operativo. Il codice generato viene eseguito in modo nativo sul processore host e il processore esegue direttamente il codice generato dal compilatore. Viene sempre compilato per targetizzare un’architettura specifica e verrà eseguito solo sulla piattaforma prevista. Quindi, se vuoi eseguire lo stesso codice su architetture diverse, dovrai ricompilare il codice usando quella particolare architettura.

I file eseguibili non gestiti sono fondamentalmente un’immagine binaria, codice x86, caricati direttamente in memoria. Questo approccio di solito porta a un’esecuzione del codice più veloce, ma nella maggior parte dei casi la diagnosi e il recupero dagli errori potrebbero richiedere molto tempo e molto tempo. L’allocazione della memoria, il tipo safety, security, ecc. Deve essere gestita dal programmatore e questo porterà il codice non gestito a perdite di memoria come sovraccarichi del buffer, override del puntatore ecc.

Tutto il codice compilato dai compilatori C / C ++ tradizionali è Codice non gestito. I componenti COM, le interfacce ActiveX e le funzioni API Win32 sono esempi di codice non gestito. Il codice gestito è il codice scritto in molti linguaggi di programmazione di alto livello disponibili per Microsoft .NET Framework, inclusi VB.NET, C #, J #, JScript.NET ecc. Poiché Visual C ++ può essere compilato su un codice gestito o non gestito è ansible mescolare i due nella stessa applicazione.