Что такое управляемый код?
При работе с .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-инжиниринг вашего кода из IL в машинный код, который может выполняться на ЦП. Таким образом, среда CLR точно знает, что делает ваш код и может эффективно управлять.
Промежуточный язык иногда называется общим промежуточным языком (CIL).
Взаимодействие неуправляемого кода
Конечно, среда CLR позволяет передавать границы между управляемым и неуправляемным миром, и есть много кода, который делает это, даже в библиотеках классов .NET . Это называется взаимодействие, или сокращенно интероп. Эти положения позволяют, например, упаковать неуправляемую библиотеку и вызвать ее. Однако важно отметить, что после этого, когда код пересекает границы среды выполнения, фактическое управление выполнением снова находится в руках неуправляемого кода и, следовательно, попадает под те же ограничения.
Как и в этом случае, C# — это один язык, который позволяет использовать неуправляемые конструкции, такие как указатели непосредственно в коде, используя то, что называется небезопасным контекстом, который обозначает фрагмент кода, для которого выполнение не управляется средой CLR.