Qu’est-ce que le code managé ?What is "managed code"?

Lorsque vous travaillez avec .NET, vous rencontrerez souvent le terme « code managé ».When working with .NET, you will often encounter the term "managed code". Ce document explique ce que signifie ce terme et fournit des informations supplémentaires sur le sujet.This document will explain what this term means and additional information around it.

Pour faire simple, le code managé est du code dont l’exécution est gérée par un runtime.To put it very simply, managed code is just that: code whose execution is managed by a runtime. Dans ce cas, le runtime en question est appelé le Common Language Runtime ou CLR, indépendamment de l’implémentation (par exemple, mono, .NET Framework ou .net core/. net 5 +).In this case, the runtime in question is called the Common Language Runtime or CLR, regardless of the implementation (for example, Mono, .NET Framework, or .NET Core/.NET 5+). CLR est chargé de prendre le code managé, de le compiler en code machine, puis de l’exécuter.CLR is in charge of taking the managed code, compiling it into machine code and then executing it. Par ailleurs, le runtime fournit plusieurs services importants comme la gestion automatique de la mémoire, les limites de sécurité, la cohérence des types, etc.On top of that, runtime provides several important services such as automatic memory management, security boundaries, type safety etc.

Par opposition, le « code non managé » est la façon dont vous pouvez exécuter un programme C/C++.Contrast this to the way you would run a C/C++ program, also called "unmanaged code". Dans un environnement non managé, le programmeur est responsable de presque tout.In the unmanaged world, the programmer is in charge of pretty much everything. Le programme réel est, essentiellement, un fichier binaire que le système d’exploitation charge en mémoire et démarre.The actual program is, essentially, a binary that the operating system (OS) loads into memory and starts. Tout le reste, depuis la gestion de la mémoire aux considérations de sécurité, est à la charge du programmeur.Everything else, from memory management to security considerations are a burden of the programmer.

Le code managé est écrit dans un des langages de haut niveau qui peuvent être exécutés sur .NET, tels que C#, Visual Basic ou F#.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. Quand vous compilez du code écrit dans ces langages avec leur compilateur respectif, vous n’accédez pas au code machine.When you compile code written in those languages with their respective compiler, you don't get machine code. Vous obtenez un code en langage intermédiaire que le runtime compile ensuite et exécute.You get Intermediate Language code which the runtime then compiles and executes. C++ est la seule exception à cette règle, car il peut également produire des fichiers binaires natifs, non managés qui s’exécutent sur Windows.C++ is the one exception to this rule, as it can also produce native, unmanaged binaries that run on Windows.

Langage intermédiaire et exécutionIntermediate Language & execution

Qu’est-ce que le « langage intermédiaire » (ou IL en abrégé) ?What is "Intermediate Language" (or IL for short)? Il s’agit d’un produit de compilation de code écrit dans des langages .NET de haut niveau.It is a product of compilation of code written in high-level .NET languages. Quand vous compilez votre code écrit dans un de ces langages, vous obtenez un fichier binaire constitué de langage intermédiaire.Once you compile your code written in one of these languages, you will get a binary that is made out of IL. Il est important de noter que le langage intermédiaire est indépendant de tout langage spécifique qui s’exécute par-dessus le Runtime. Il existe même une spécification distincte, que vous pouvez lire si vous le souhaitez.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.

Une fois que vous avez produit du langage intermédiaire à partir de votre code de haut niveau, vous pouvez l’exécuter.Once you produce IL from your high-level code, you will most likely want to run it. C’est là que le CLR intervient et démarre le processus de compilation juste-à-temps, ou JIT-ing de votre code à partir du langage intermédiaire en code machine qui peut être exécuté sur un processeur.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. De cette façon, le CLR sait exactement ce que votre code est en train de faire et peut donc le gérer efficacement.In this way, the CLR knows exactly what your code is doing and can effectively manage it.

Le langage intermédiaire est parfois appelé langage CIL (Common Intermediate Language) ou langage MSIL (Microsoft Intermediate Language).Intermediate Language is sometimes also called Common Intermediate Language (CIL) or Microsoft Intermediate Language (MSIL).

Interopérabilité du code non managéUnmanaged code interoperability

Bien entendu, le CLR permet de franchir les limites entre les environnements managé et non managé, et il y a beaucoup de code qui le fait, même dans les bibliothèques de classes de base.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. Cela s’appelle l’interopérabilité ou simplement interop en abrégé.This is called interoperability or just interop for short. Ces dispositions vous permettent, par exemple, d’encapsuler une bibliothèque non managée et d’y effectuer des appels.These provisions would allow you to, for example, wrap up an unmanaged library and call into it. Toutefois, notez qu’une fois que vous l’avez fait, quand le code franchit les limites du runtime, la gestion réelle de l’exécution est à nouveau entre les mains du code non managé et subit donc les mêmes restrictions.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.

De la même manière, C# est un langage qui vous permet d’utiliser des constructions non managées comme les pointeurs directement dans le code en utilisant ce que l’on appelle le contexte unsafe, qui désigne un élément de code dont l’exécution n’est pas gérée par le CLR.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.

Plus de ressourcesMore resources