Unterschied zwischen "verwaltet" und "nicht verwaltet"

138

Ich höre / lese manchmal davon, wenn ich über .NET spreche, zum Beispiel "verwalteter Code" und "nicht verwalteter Code", aber ich habe keine Ahnung, was sie sind und was ihre Unterschiede sind. Was ist per Definition ihr Unterschied? Was sind die Konsequenzen der Verwendung von beiden? Gibt es diese Unterscheidung nur in .NET / Windows?

Louis Rhys
quelle

Antworten:

190

Verwalteter Code

Verwalteter Code wird von Visual Basic .NET- und C # -Compilern erstellt. Es läuft auf der CLR (Common Language Runtime), die unter anderem Dienste wie Garbage Collection, Laufzeit-Typprüfung und Referenzprüfung bietet. Also, denken Sie daran , wie „Mein Code wird verwaltet von der CLR.“

Visual Basic und C # können nur verwalteten Code erzeugen. Wenn Sie also eine Anwendung in einer dieser Sprachen schreiben, schreiben Sie eine von der CLR verwaltete Anwendung. Wenn Sie eine Anwendung in Visual C ++ .NET schreiben, können Sie verwalteten Code erstellen, wenn Sie möchten, dies ist jedoch optional.

Nicht verwalteter Code

Nicht verwalteter Code wird direkt in Maschinencode kompiliert. Nach dieser Definition ist der gesamte Code, der von herkömmlichen C / C ++ - Compilern kompiliert wird, "nicht verwalteter Code". Da es zu Maschinencode und nicht zu einer Zwischensprache kompiliert wird, ist es auch nicht portierbar.

Keine freie Speicherverwaltung oder sonst etwas, was die CLR bietet.

Da Sie mit Visual Basic oder C # keinen nicht verwalteten Code erstellen können, wird in Visual Studio der gesamte nicht verwaltete Code in C / C ++ geschrieben.

Die beiden mischen

Da Visual C ++ entweder zu verwaltetem oder zu nicht verwaltetem Code kompiliert werden kann, ist es möglich, beide in derselben Anwendung zu mischen. Dies verwischt die Grenze zwischen den beiden und verkompliziert die Definition. Es ist jedoch erwähnenswert, damit Sie wissen, dass immer noch Speicherlecks auftreten können, wenn Sie beispielsweise eine Bibliothek eines Drittanbieters mit schlecht geschriebenem, nicht verwaltetem Code verwenden.

Hier ist ein Beispiel, das ich beim Googeln gefunden habe :

#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;
}
kurige
quelle
11
"Da Sie mit Visual Basic oder C # keinen nicht verwalteten Code erstellen können, wird der gesamte nicht verwaltete Code in C / C ++ geschrieben."? Sie wissen, es gibt andere Sprachen als C, C ++, C # und VB. Ich benutze Delphi, um nicht verwalteten Code zu schreiben. Ein ziemlich sichtbarer Unterschied zwischen verwaltetem (.NET) und nicht verwaltetem (Win32) Code besteht darin, dass erstere alle .NET-Funktionen verwenden können, während letztere die native Windows-API verwenden.
Andreas Rejbrand
22
Die Begriffe "verwaltet" und "nicht verwaltet" wurden erfunden, um Maschinencode von IR zu unterscheiden. Sie haben also nur im Kontext von .NET wirklich Bedeutung . Der Linux-Kernel kompiliert auch zu nicht verwaltetem Code, aber das ist für die Diskussion nicht wirklich relevant, oder?
Kurige
6
Dies kommt vom Thema ab, aber mein Punkt ist, dass Sie nicht die Möglichkeit haben , verwalteten Code in Delphi zu schreiben. Daher ist die Angabe, dass Sie nicht verwalteten Code in Delphi schreiben, hochgradig redundant. Auf jeden Fall habe ich dem beleidigenden Satz "in Visual Studio" hinzugefügt. Vielen Dank auch für die Hinweise zum Tippfehler. Irgendwie habe ich es sogar beim zweiten Durchlesen verpasst.
Kurige
Nur um ein Pedand zu sein, ist es möglich, nicht verwalteten Code in C # ( bekannt als "unsicherer" Code ) zu schreiben
Basic
2
@JacksonTale Java steht nicht im Kontext von .NET, daher ist das Konzept der Verwaltung oder Nichtverwaltung nicht anwendbar. Unter stackoverflow.com/questions/1326071/… finden Sie eine Erläuterung zum Kompilieren von Java.
Evan Frisch
84

Dies ist allgemeiner als .NET und Windows. Verwaltet ist eine Umgebung, in der Sie über automatische Speicherverwaltung, Speicherbereinigung, Typensicherheit usw. verfügen. Nicht verwaltet ist alles andere. So ist beispielsweise .NET eine verwaltete Umgebung und C / C ++ ist nicht verwaltet.

Darin Dimitrov
quelle
Nach dieser Definition wäre JavaScript auch nicht verwalteter Code, richtig?
Hampton Terry
@HamptonTerry Javascript verfügt über automatische Speicherverwaltung, Speicherbereinigung und Typensicherheit ... Also nein. Javascript wird verwaltet.
Sancarn
13

Verwalteter Code ist eine Differenzierung, die von Microsoft geprägt wurde, um Computerprogrammcode zu identifizieren, der nur unter der "Verwaltung" einer virtuellen Common Language Runtime-Maschine erforderlich ist und ausgeführt wird (was zu Bytecode führt).

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

RobertPitt
quelle
1
Ja. Um diese Antwort zu ergänzen, ist verwalteter Code der Code, den Sie normalerweise in .NET (z. B. in C #) mit den .NET-Funktionen schreiben. Native Windows-Anwendungen, die die native Windows-API verwenden (möglicherweise in einer beliebigen Sprache geschrieben, C), sind dagegen "nicht verwaltet".
Andreas Rejbrand