Was ist „verwalteter Code“?What is "managed code"?

Bei der Arbeit mit .NET Framework begegnen Sie häufig dem Begriff „verwalteter Code“.When working with .NET Framework, you will often encounter the term "managed code". In diesem Dokument wird erläutert, was dieser Begriff bedeutet, und es werden zusätzliche Informationen dazu bereitgestellt.This document will explain what this term means and additional information around it.

Sehr einfach ausgedrückt, ist verwalteter Code genau das, was der Name besagt: Code, dessen Ausführung von einer Runtime verwaltet wird.To put it very simply, managed code is just that: code whose execution is managed by a runtime. In diesem Fall wird die betreffende Runtime als Common Language Runtime oder CLR bezeichnet, unabhängig von der Implementierung (Mono oder .NET Framework oder .NET Core).In this case, the runtime in question is called the Common Language Runtime or CLR, regardless of the implementation (Mono or .NET Framework or .NET Core). Die CLR übernimmt die Aufgabe, den verwalteten Code in Computercode zu kompilieren und dann auszuführen.CLR is in charge of taking the managed code, compiling it into machine code and then executing it. Darüber hinaus bietet die Common Language Runtime mehrere wichtige Dienste wie die automatische Arbeitsspeicherverwaltung, Sicherheitsgrenzen, Typsicherheit usw.On top of that, runtime provides several important services such as automatic memory management, security boundaries, type safety etc.

Vergleichen Sie dies mit der Art und Weise, auf die Sie ein C-/C++-Programm ausführen, dem sogenannten „nicht verwalteten Code“.Contrast this to the way you would run a C/C++ program, also called "unmanaged code". Im nicht verwalteten Bereich ist der Programmierer für nahezu alles zuständig.In the unmanaged world, the programmer is in charge of pretty much everything. Das tatsächliche Programm ist im Wesentlichen eine Binärdatei, die vom Betriebssystem in den Arbeitsspeicher geladen und gestartet wird.The actual program is, essentially, a binary that the operating system (OS) loads into memory and starts. Alles Übrige, von der Arbeitsspeicherverwaltung bis hin zu den Sicherheitsaspekten, liegt in der Verantwortung des Programmierers.Everything else, from memory management to security considerations are a burden of the programmer.

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.Managed code is written in one of the high-level languages that can be run on top of .NET, such as C#, Visual Basic, F# and others. Wenn Sie in diesen Sprachen geschriebenen Code mit ihrem jeweiligen Compiler kompilieren, erhalten Sie keinen Computercode.When you compile code written in those languages with their respective compiler, you don’t get machine code. Sie erhalten Code in einer Zwischensprache, Intermediate Language, der von der Runtime kompiliert und ausgeführt wird.You get Intermediate Language code which the runtime then compiles and executes. C++ ist die einzige Ausnahme von dieser Regel, da diese Sprache auch native, nicht verwaltete Binärdateien erstellen kann, die unter Windows ausgeführt werden.C++ is the one exception to this rule, as it can also produce native, unmanaged binaries that run on Windows.

Zwischensprache (Intermediate Language) und AusführungIntermediate Language & execution

Was ist eine Zwischensprache (Intermediate Language, kurz IL)?What is "Intermediate Language" (or IL for short)? Dies ist ein Produkt der Kompilierung von Code, der in allgemeinen .NET-Sprachen geschrieben wurde.It is a product of compilation of code written in high-level .NET languages. Nachdem Sie den Code kompiliert haben, der in einer dieser Sprachen geschrieben wurde, erhalten Sie eine Binärdatei, die aus IL besteht.Once you compile your code written in one of these languages, you will get a binary that is made out of IL. 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.It is important to note that the IL is independent from any specific language that runs on top of the runtime; there is even a separate specification for it that you can read if you’re so inclined.

Nachdem Sie IL-Code aus dem allgemeinen Code erstellt haben, möchten Sie diesen höchstwahrscheinlich ausführen.Once you produce IL from your high-level code, you will most likely want to run it. 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.This is where the CLR takes over and starts the process of Just-In-Time compiling, or JIT-ing your code from IL to machine code that can actually be run on a CPU. Auf diese Weise ist die CLR genau über den Status Ihres Codes informiert und kann ihn effektiv verwalten.In this way, the CLR knows exactly what your code is doing and can effectively manage it.

Intermediate Language wird auch als Common Intermediate Language (CIL) oder Microsoft Intermediate Language (MSIL) bezeichnet.Intermediate Language is sometimes also called Common Intermediate Language (CIL) or Microsoft Intermediate Language (MSIL).

Interoperabilität mit nicht verwaltetem CodeUnmanaged code interoperability

Natürlich erlaubt die CLR ein Überschreiten der Grenzen zwischen dem verwaltetem und dem nicht verwaltetem Bereich, und es gibt selbst in den Basisklassenbibliotheken eine Menge Code, der diese Möglichkeit nutzt.Of course, the CLR allows passing the boundaries between managed and unmanaged world, and there is a lot of code that does that, even in the Base Class Libraries. Dies wird als Interoperabilität oder kurz als Interop bezeichnet.This is called interoperability or just interop for short. Durch diese Möglichkeit können Sie beispielsweise eine nicht verwaltete Bibliothek paketieren und aufrufen.These provisions would allow you to, for example, wrap up an unmanaged library and call into it. Allerdings müssen Sie bei dieser Vorgehensweise beachten, dass die eigentliche Verwaltung der Ausführung wieder beim nicht verwalteten Code liegt, sobald der Code die Grenzen der Runtime überschreitet, und dass die Ausführung daher denselben Einschränkungen unterliegt.However, it is important to note that once you do this, when the code passes the boundaries of the runtime, the actual management of the execution is again in the hand of unmanaged code, and thus falls under the same restrictions.

In ähnlicher Weise ist C# eine Sprache, die Ihnen die Verwendung nicht verwalteter Konstrukte, z.B. Zeiger, direkt im Code erlaubt, indem Sie den so genannten unsicheren Kontext nutzen. Dieser bezeichnet einen Teil des Codes, dessen Ausführung nicht von der CLR verwaltet wird.Similar to this, C# is one language that allows you to use unmanaged constructs such as pointers directly in code by utilizing what is known as unsafe context which designates a piece of code for which the execution is not managed by the CLR.

Weitere RessourcenMore resources