Управляемый (managed) и неуправляемый (unmanaged) код в .NET

В C# существует два ключевых подхода к исполнению кода: управляемый (managed) и неуправляемый (unmanaged). Эти понятия определяют, как программа взаимодействует с операционной системой, управляет памятью и обрабатывает ошибки.

Управляемый код (Managed Code)

Это код, который выполняется под управлением Common Language Runtime (CLR) — среды выполнения .NET. CLR управляет памятью, обработкой исключений, безопасностью и другими важными аспектами.

Признаки управляемого кода:

  • Выполняется в среде CLR
  • Поддерживает сборку мусора (Garbage Collection).
  • Имеет доступ к .NET-библиотекам
  • Обеспечивает безопасность типов

Пример управляемого кода:

class Program
{
    static void Main()
    {
        Console.WriteLine("Это управляемый код");
    }
}

Здесь весь код работает внутри CLR, и .NET управляет памятью автоматически.

Неуправляемый код (Unmanaged Code)

Это код, который напрямую взаимодействует с операционной системой, аппаратным обеспечением или использует внешние библиотеки (например, на C/C++).

Признаки неуправляемого кода:

  • Требует ручного управления памятью (например, malloc/free в C/C++)
  • Может напрямую работать с системными API
  • Может вызывать код на других языках (например, через P/Invoke)

Пример вызова неуправляемого кода в C#:

public class HelloWorld {
    [DllImport("user32.dll", CharSet=CharSet.Auto)]
    public static extern IntPtr MessageBox(int hWnd, String text, String caption, uint type);

    public static void Main() {
       MessageBox(0, "Hello, world!", "Unmanaged Code", 0);
    }
}

Здесь MessageBox — это функция из Windows API (неуправляемый код), а DllImport позволяет вызывать её из C#.