Was ist "verwalteter Code"?
Bei der Arbeit mit .NET begegnen Sie häufig dem Begriff „verwalteter Code“. In diesem Artikel wird erläutert, was verwalteter Code bedeutet, und es werden zusätzliche Informationen dazu bereitgestellt.
Um es einfach zu setzen, ist verwalteter Code nur das: Code, dessen Ausführung von einer Laufzeit verwaltet wird. In diesem Fall wird die betreffende Laufzeit unabhängig von der Implementierung (z. B. Mono, .NET Framework oder .NET Core/.NET 5+) als Common Language Runtime oder CLR bezeichnet. Die CLR übernimmt den verwalteten Code, kompiliert ihn in Computercode und führt ihn dann aus. Darüber hinaus bietet die Laufzeit mehrere wichtige Dienste wie automatische Speicherverwaltung, Sicherheitsgrenzen und Typsicherheit.
Kontrastieren Sie dies so, wie Sie ein C/C++-Programm ausführen würden, das auch als "nicht verwalteter Code" bezeichnet wird. In der nicht verwalteten Welt ist der Programmierer für ziemlich alles verantwortlich. Das eigentliche Programm ist im Wesentlichen eine Binärdatei, die vom Betriebssystem in den Arbeitsspeicher geladen und gestartet wird. Alles andere, von der Speicherverwaltung bis hin zu Sicherheitsaspekten, sind eine Last des Programmierers.
Verwalteter Code wird in einer der allgemeinen Sprachen geschrieben, die auf .NET ausgeführt werden können, z. B. C#, Visual Basic, F# und andere. Wenn Sie Code kompilieren, der in diesen Sprachen mit dem jeweiligen Compiler geschrieben wurde, erhalten Sie keinen Computercode. Sie erhalten Code in einer Zwischensprache, Intermediate Language, der von der Runtime kompiliert und ausgeführt wird. C++ ist die einzige Ausnahme für diese Regel, da sie auch systemeigene, nicht verwaltete Binärdateien erzeugen kann, die unter Windows ausgeführt werden.
Zwischensprache und Ausführung
Was ist "Intermediate Language" (oder kurz IL)? Es ist ein Produkt der Kompilierung von Code, der in high-level .NET-Sprachen geschrieben wurde. Nachdem Sie Ihren Code in einer dieser Sprachen kompiliert haben, erhalten Sie eine Binärdatei, die aus IL besteht. Beachten Sie unbedingt, dass der IL-Code unabhängig von einer bestimmten Sprache ist, die auf der Runtime ausgeführt wird. Es gibt sogar eine separate Spezifikation dafür, die Sie bei Interesse nachlesen können.
Nachdem Sie IL-Code aus dem allgemeinen Code erstellt haben, möchten Sie diesen höchstwahrscheinlich ausführen. An dieser Stelle übernimmt die CLR und startet den Prozess der Just-In-Time-Kompilierung Ihres Codes aus der Zwischensprache in Computercode, der dann auf einer CPU ausgeführt werden kann. Auf diese Weise ist die CLR genau über den Status Ihres Codes informiert und kann ihn effektiv verwalten.
Zwischensprache wird manchmal auch als Common Intermediate Language (CIL) bezeichnet.
Nicht verwaltete Codeinteroperabilität
Natürlich erlaubt die CLR ein Überschreiten der Grenzen zwischen dem verwaltetem und dem nicht verwaltetem Bereich, und es gibt selbst in den -Klassenbibliotheken eine Menge Code, der diese Möglichkeit nutzt. Dies wird als Interoperabilität oder kurz Interop bezeichnet. Durch diese Möglichkeit können Sie beispielsweise eine nicht verwaltete Bibliothek paketieren und aufrufen. Es ist jedoch wichtig zu beachten, dass, sobald Sie dies tun, wenn der Code die Grenzen der Laufzeit überschreitet, die tatsächliche Verwaltung der Ausführung wieder in der Hand des nicht verwalteten Codes liegt und daher denselben Einschränkungen unterliegt.
In ähnlicher Weise ist C# eine Sprache, die Ihnen die Verwendung nicht verwalteter Konstrukte (z. B. Zeiger) direkt im Code erlaubt, indem Sie den sogenannten unsicheren Kontext nutzen. Dieser kennzeichnet einen Teil des Codes, dessen Ausführung nicht von der CLR verwaltet wird.