Was ist verwalteter oder nicht verwalteter Code in der Programmierung?

150

Ich verwende einen bestimmten Befehl in meinem C # -Code, der gut funktioniert. Es wird jedoch gesagt, dass es sich in "nicht verwaltetem" Code schlecht verhält.

Was ist verwalteter oder nicht verwalteter Code?

Pokus
quelle

Antworten:

75

Hier ist ein Text von MSDN über nicht verwalteten Code .

Einige Bibliothekscodes müssen nicht verwalteten Code aufrufen (z. B. native Code-APIs wie Win32). Da dies bedeutet, dass der verwaltete Code außerhalb des Sicherheitsbereichs liegt, ist Vorsicht geboten.

Hier ist eine weitere kostenlose Erklärung zu verwaltetem Code:

  • Code, der von der CLR ausgeführt wird.
  • Code, der auf die Common Language Runtime abzielt, die Grundlage von .NET Framework, wird als verwalteter Code bezeichnet.
  • Verwalteter Code liefert die Metadaten, die die CLR benötigt, um Dienste wie Speicherverwaltung, sprachübergreifende Integration, Codezugriffssicherheit und automatische Lebensdauerkontrolle von Objekten bereitzustellen. Der gesamte auf IL basierende Code wird als verwalteter Code ausgeführt.
  • Code, der in der CLI-Ausführungsumgebung ausgeführt wird.

Für Ihr Problem:

Ich denke, das liegt daran, dass NUnit Ihren Code für UnitTesting ausführt und möglicherweise einen Teil davon nicht verwaltet. Aber ich bin mir nicht sicher, also nimm das nicht für Gold. Ich bin sicher, dass Ihnen jemand mehr Informationen darüber geben kann. Ich hoffe es hilft!

Patrick Desjardins
quelle
12
Ich schätze die Mühe, die in Ihre Antwort fließt. Aber Leute, die nicht wissen, was "verwalteter Code" ist, werden mit dem, was Sie in Ihrer Antwort meinen, zu kämpfen haben: Sie werden nicht wissen: "Bibliothekscode", "nicht verwalteter Code", "native Code-API", CLR, die Grundlage des .net-Frameworks, der
IL-
200

Dies ist ein guter Artikel zu diesem Thema.

Zusammenfassen,

  1. Verwalteter Code wird nicht zu Maschinencode kompiliert, sondern zu einer Zwischensprache, die von einem Dienst auf einer Maschine interpretiert und ausgeführt wird und daher in einem (hoffentlich!) Sicheren Framework arbeitet, das gefährliche Dinge wie Speicher und Threads für Sie behandelt. Im modernen Sprachgebrauch bedeutet dies häufig .NET, muss es aber nicht.

Ein Anwendungsprogramm, das in einer Laufzeit-Engine ausgeführt wird, die auf demselben Computer installiert ist. Die Anwendung kann ohne sie nicht ausgeführt werden. Die Laufzeitumgebung bietet die allgemeine Bibliothek von Softwareroutinen, die das Programm verwendet, und führt normalerweise eine Speicherverwaltung durch. Es kann auch eine Just-in-Time-Konvertierung (JIT) von Quellcode zu ausführbarem Code oder von einer Zwischensprache zu ausführbarem Code bereitstellen. Beispiele für Laufzeit-Engines sind Java, Visual Basic und .NETs Common Language Runtime (CLR). ( Lesen Sie mehr )

  1. Nicht verwalteter Code wird zu Maschinencode kompiliert und daher direkt vom Betriebssystem ausgeführt. Es hat daher die Fähigkeit, schädliche / mächtige Dinge zu tun, die verwalteter Code nicht tut. So funktionierte früher alles, daher ist es normalerweise mit alten Dingen wie DLLs verbunden.

Ein ausführbares Programm, das von selbst ausgeführt wird. Das vom Betriebssystem aus gestartete Programm ruft die Softwareroutinen des Betriebssystems auf und verwendet sie, erfordert jedoch nicht die Verwendung eines anderen Softwaresystems. Assembler-Programme, die in Maschinensprache zusammengestellt wurden, und C / C ++ - Programme, die in Maschinensprache für eine bestimmte Plattform kompiliert wurden, sind Beispiele für nicht verwalteten Code. ( Lesen Sie mehr )

  1. Native Code ist oft gleichbedeutend mit Unmanaged, aber nicht identisch.
Annakata
quelle
Sie meinen, dass wir beim Hacken keine .net-Sprache (C #, C ++) verwenden können, oder?
Haroon A.
7
@H_wardak was definierst du als "hacken"? Es ist ein sehr allgemeiner Begriff, es ist wie zu sagen, dass das Hacken in NORAD und das Hacken einiger Register gleich sind.
Alex
7
Ich wurde einmal vom Interviewer gefragt, ob wir nicht verwalteten Code in C # ausführen / schreiben können. Kann mir jemand dabei helfen?
RSB
8
@RSB: Sie können keinen nicht verwalteten Code in C # schreiben (obwohl Sie nicht verwalteten Code direkt von C # aus aufrufen können). Theoretisch könnten Sie es mit dem richtigen Compiler und Framework tun, denke ich. In der Praxis bedeutet dies, dass Sie einen Compiler benötigen, der C # kompilieren kann, um Code direkt zu verarbeiten. Ich bin mir nicht sicher, wie das funktionieren würde.
James Haug
67

Wenn Sie an nicht verwalteten Code denken , denken Sie an maschinenspezifischen Code auf Maschinenebene. Wie x86-Assemblersprache. Nicht verwalteter (nativer) Code wird kompiliert und verknüpft, um direkt auf dem Prozessor ausgeführt zu werden, für den er entwickelt wurde, mit Ausnahme des gesamten Betriebssystems. Es ist nicht tragbar, aber es ist schnell. Sehr einfacher, abgespeckter Code.

Verwalteter Code ist alles von Java bis zu altem Interpretive BASIC oder alles, was unter .NET ausgeführt wird. Verwalteter Code wird normalerweise zu einem P-Code- oder Bytecode-Befehlssatz mittlerer Ebene kompiliert. Dies sind keine maschinenspezifischen Anweisungen, obwohl sie der Assemblersprache ähneln. Verwalteter Code isoliert das Programm von dem Computer, auf dem es ausgeführt wird, und erstellt eine sichere Grenze, in der der gesamte Speicher indirekt zugewiesen wird. Im Allgemeinen haben Sie keinen direkten Zugriff auf Computerressourcen wie Ports, Speicheradressraum, Stapel usw. Die Idee ist, in einer sichereren Umgebung zu laufen.

Um beispielsweise von einer verwalteten Variablen in eine nicht verwaltete Variable zu konvertieren, müssen Sie zum eigentlichen Objekt selbst gelangen. Es ist wahrscheinlich in einer zusätzlichen Verpackung verpackt oder verpackt. Nicht verwaltete Variablen (wie z. B. ein 'int') - auf einem 32-Bit-Computer - benötigen genau 4 Byte. Es gibt keinen Overhead oder zusätzliche Verpackung. Der Übergang von verwaltetem zu nicht verwaltetem Code - und wieder zurück - wird als " Marshalling " bezeichnet. Es ermöglicht Ihren Programmen, die Grenze zu überschreiten.

TJPowell
quelle
1
Wie interagiert Mashalling dann mit Wert- und Referenztypen? Ich erinnere mich, dass ich zum Beispiel etwas über MarshalByRefObject gesehen habe.
Kyle Baran
24

In so wenigen Worten wie möglich:

  • verwalteter Code = .NET-Programme
  • nicht verwalteter Code = "normale" Programme
Vilx-
quelle
16
Ein .NET-Programm ist nicht "normal"?
jtate
1
@jtate - Das macht es ein bisschen dumm, ja. :) Ich habe versucht, es intuitiver zu machen. Jedenfalls war das jetzt vor über 8 Jahren. Angesichts der Vielzahl von Programmiersprachen im alltäglichen Gebrauch ist diese Unterscheidung heute sogar noch ungenauer, ja.
Vilx
5

Verwalteter Code ist das, was Compiler von C # .Net, VB.Net, F # .Net usw. erstellen. Es läuft auf der CLR, die unter anderem Dienste wie Garbage Collection, Referenzprüfung und vieles mehr bietet. Stellen Sie sich vor, mein Code wird von der CLR verwaltet.

Auf der anderen Seite wird nicht verwalteter Code direkt in Maschinencode kompiliert. Es wird nicht von CLR verwaltet.

Arif
quelle
4

Grundsätzlich ist nicht verwalteter Code Code, der nicht unter der .NET-CLR ausgeführt wird (auch bekannt als nicht VB.NET, C # usw.). Ich vermute, dass NUnit einen Runner / Wrapper hat, der kein .NET-Code (auch bekannt als C ++) ist.

joegtp
quelle
4

Verwalteter Code:
Code, der unter einem "Kooperationsvertrag" mit der Common Language Runtime ausgeführt wird. Verwalteter Code muss die für die Laufzeit erforderlichen Metadaten bereitstellen, um Dienste wie Speicherverwaltung, sprachübergreifende Integration, Codezugriffssicherheit und automatische Lebensdauerkontrolle von Objekten bereitzustellen. Der gesamte Code, der auf der Microsoft Intermediate Language (MSIL) basiert, wird als verwalteter Code ausgeführt.

Nicht verwalteter Code:
Code, der ohne Berücksichtigung der Konventionen und Anforderungen der Common Language Runtime erstellt wird. Nicht verwalteter Code wird in der Common-Language-Laufzeitumgebung mit minimalen Diensten ausgeführt (z. B. keine Speicherbereinigung, eingeschränktes Debugging usw.).

Referenz: http://www.dotnetspider.com/forum/11612-difference-between-managed-and-unmanaged-code.aspx

GMalla
quelle
3

NUnit lädt die Komponententests in eine separate AppDomain, und ich gehe davon aus, dass der Einstiegspunkt nicht aufgerufen wird (wahrscheinlich nicht benötigt wird), daher ist die Eingabeanordnung null.

Leppie
quelle
2

Verwalteter Code wird in der Umgebung von CLR ausgeführt, dh in .NET-Laufzeit. Kurz gesagt, alle ILs sind verwalteter Code. Wenn Sie jedoch eine Software-Beispielkomponente von Drittanbietern, VB6 oder VC ++, verwenden, handelt es sich um nicht verwalteten Code, da .NET-Laufzeit (CLR) keine Kontrolle hat über die Quellcodeausführung der Sprache.

Chirag Makwana
quelle
1

Verwalteter Code: - Code, dessen MSIL-Form (Intermediate Language) nach der Kompilierung des Sprachcompilers entwickelt und direkt vom CLRaufgerufenen verwalteten Code ausgeführt wird. Beispiel: - Alle 61 Sprachcodes, die vom .net Framework unterstützt werden

Nicht verwalteter Code: - Code, der zuvor entwickelt wurde und .netfür den das MSIL-Formular nicht verfügbar ist und von CLRdirekt ausgeführt CLRwird, leitet zum Betriebssystem weiter. Dies wird als nicht verwalteter Code bezeichnet.

Beispiel: -COM, Win32-APIs

Ashok Narwal
quelle
In diesem Beitrag gibt es eine Reihe von Fehlern. Am offensichtlichsten MISL (Sie meinen MSIL).
Matt Seymour
1
  • Verwalteter Code: Code, der in einer .NET-Sprache wie C #, VB.NET geschrieben wurde.
  • Nicht verwalteter Code: Code, der nicht in der .NET-Sprache und in MSIL geschrieben ist, versteht nicht, was er ist, und kann nicht unter CLR ausgeführt werden. Wie Steuerelemente von Drittanbietern haben wir sie in unseren .NET-Anwendungen verwendet, die nicht in .NET-Sprachen erstellt wurden.
Saket Kumar
quelle
0

Zunächst einmal verstehen, vor .NET framework, Microsoftwurden die Stand-alone - Produkte wie die Bereitstellung MFC (Visual C++), VB, FoxProusw.

Im Jahr 2002 kombinierte Microsoft seine Produkte und erstellte .NET Framework. Jetzt gibt es einen Unterschied zwischen der vorherigen Ausführung von Code und der Verwaltung und Ausführung von Code in .NET Framework. Microsoft hat das Konzept von CLR.NET Framework eingeführt, das den Code kompiliert, der aus einer unterstützten Sprache von .NET Framework stammt, und zusätzliche Funktionen wie memory mangement, garbage collectionusw. bereitstellt. Solche CLR-Funktionen waren jedoch vorher nicht direkt verfügbar.

Wenn Sie also eine Bibliothek / einen Code in .NET Framework (kompiliert mit CLR) erstellen, wird dies aufgerufen Managed code. Sie können diese Bibliothek in anderen .NET-Anwendungen / -Projekten weiter verwenden. Auch dort versteht CLR, wie sie zuvor kompiliert wurde, und bleibt daher Ihr Verwaltungscode.

OTOH Wenn Sie die Bibliotheken verwenden möchten, die vor .NET Framework geschrieben wurden, können Sie bestimmte Einschränkungen beachten. Denken Sie jedoch daran, dass CLR diesen Code jetzt nicht versteht und erneut kompiliert, da CLR zu diesem Zeitpunkt noch nicht vorhanden war . Und das wird genannt unmanaged code. Bitte beachten Sie, dass Bibliotheken / Baugruppen, die von Dritten erstellt wurden, um bestimmte Funktionen / Tools bereitzustellen, auch als nicht verwalteter Code betrachtet werden können, wenn sie nicht CLR-kompatibel sind.

In Laienbegriffen, Verwalten von Code etwas, das Ihre CLR versteht und das sie zur weiteren Ausführung selbst kompilieren kann. In .NET Framework (aus jeder Sprache, die mit .NET Framework funktioniert) Wenn Code an CLR gesendet wird, liefert der Code einige Metadateninformationen, sodass CLR Ihnen die hier angegebenen Funktionen bereitstellen kann . Nur wenige von ihnen sind Garbage collection, Performance improvements, cross-language integration, memory managementusw.

OTOH, unveränderter Code ist maschinenspezifisch und einsatzbereit. Sie müssen nicht weiter verarbeitet werden.

Amnesh Goel
quelle
Ich fürchte, viele, viele, viele uninformierte Meinungen. Dies mag überraschen, aber die CLR kann auch nicht verwalteten Code (normalerweise in C ++ / CLI geschrieben) ausführen. Es ist auch nicht erforderlich, dass verwalteter Code als IL verfügbar ist. .NET Native gibt es schon seit einiger Zeit und es enthält vorkompilierte Assemblys. Was Sie als "CLR-kompatibel" bezeichnet haben, soll wahrscheinlich "CLS-kompatibel" sein . Wenn die CLS-Konformität nicht eingehalten wird, wird verwalteter Code plötzlich nicht mehr verwaltet. Der Konsum von nicht verwaltetem Code ist - trotz Ihrer Beschreibung - ebenfalls recht einfach (RCW über COM, P / Invoke, C ++ / CLI usw.).
Unsichtbarer
0

Ab Pro C # 5 und .NET 4.5 Framework:

Verwalteter oder nicht verwalteter Code: Der vielleicht wichtigste Punkt zum Verständnis der C # -Sprache ist, dass sie Code erzeugen kann, der nur innerhalb der .NET-Laufzeit ausgeführt werden kann (Sie könnten C # niemals zum Erstellen eines nativen COM-Servers oder eines nicht verwalteten C / C ++ verwenden Anwendung). Offiziell ist der Begriff, der zur Beschreibung des Codes für die .NET-Laufzeit verwendet wird, verwalteter Code. Die binäre Einheit, die den verwalteten Code enthält, wird als Assembly bezeichnet (weitere Details zu Assemblys in Kürze). Umgekehrt wird Code, der nicht direkt von der .NET-Laufzeit gehostet werden kann, als nicht verwalteter Code bezeichnet.

arush436
quelle