Что такое управляемый код
При работе с .NET часто возникает термин "управляемый код". В этой статье объясняется, что означает управляемый код и предоставляет дополнительные сведения об этом.
Проще говоря, управляемый код — это просто код, выполнение которого управляется средой выполнения. В этом случае соответствующая среда выполнения называется общеязыковой средой выполнения или средой CLR, независимо от реализации (например, Mono, .NET Framework или .NET Core/.NET 5 и более поздних версий). Среда CLR отвечает за прием управляемого кода, компиляцию его в машинный код и его выполнение. Кроме того, среда выполнения предоставляет несколько важных служб, таких как автоматическое управление памятью, границы безопасности и безопасность типов.
Сравните это с запуском программы C/C++, которая также называется "неуправляемым кодом". В мире неуправляемого кода практически за все отвечает программист. Сама программа представляет собой двоичный файл, который операционная система (ОС) загружает в память и запускает. За все остальное — от управления памятью до различных аспектов безопасности — отвечает программист.
Управляемый код пишется в одном из языков высокого уровня, которые могут выполняться в .NET, например C#, Visual Basic, F# и других. При компиляции кода, написанного на этих языках, с помощью соответствующего компилятора вы получаете не машинный код. Вы получаете код промежуточного языка, который затем компилируется и запускается средой выполнения. Язык C++ является исключением из этого правила, так как он позволяет создавать машинные неуправляемые двоичные файлы, которые запускаются в Windows.
Промежуточный язык и выполнение
Что такое "промежуточный язык" (сокращенно IL)? Это результат компиляции кода, написанного на языках высокого уровня .NET. После компиляции кода, написанного на одном из этих языков, вы получаете двоичный файл на базе IL. Важно отметить, что IL не зависит от языка, выполняемого поверх среды выполнения. Для него даже есть отдельная спецификация, с которой при желании можно ознакомиться.
После создания IL из кода высокого уровня вы, скорее всего, захотите запустить его. В этот момент среда CLR берет управление на себя и запускает процесс JIT-компиляции, используя JIT для преобразования кода из промежуточного языка в машинный код, который может выполняться на ЦП. Таким образом, среде CLR точно известно, что делает код, поэтому она может эффективно управлять им.
Промежуточный язык иногда называется общим промежуточным языком (CIL) или общим промежуточным языком (CIL).
Взаимодействие неуправляемого кода
Конечно, среда CLR позволяет передавать границы между управляемым и неуправляемным миром, и есть много кода, который делает это, даже в библиотеках классов .NET. Это называется взаимодействием или взаимодействием для короткого времени. Все это позволяет вам, например, заключить неуправляемую библиотеку в оболочку и вызвать ее. Но следует отметить, что после того как код пересекает границы среды выполнения, управление выполнением снова осуществляется в виде неуправляемого кода с соответствующими ограничениями.
Как и в этом случае, C# — это один язык, который позволяет использовать неуправляемые конструкции, такие как указатели непосредственно в коде, используя небезопасный контекст, который обозначает фрагмент кода, для которого выполнение не управляется средой CLR.