Когда вы думаете о неуправляемом , думайте о машинном коде машинного уровня. Как и на ассемблере x86. Неуправляемый (нативный) код компилируется и связывается для запуска непосредственно на процессоре, для которого он был разработан, исключая все компоненты ОС на данный момент. Это не портативный, но это быстро. Очень простой, урезанный код.
Управляемый код - это все, от Java до старой интерпретирующей версии BASIC, или все, что работает под .NET. Управляемый код обычно компилируется в P-код промежуточного уровня или набор инструкций байтового кода. Это не машинно-ориентированные инструкции, хотя они похожи на язык ассемблера. Управляемый код изолирует программу от машины, на которой она выполняется, и создает безопасную границу, в которой вся память выделяется косвенно, и, вообще говоря, у вас нет прямого доступа к ресурсам машины, таким как порты, адресное пространство памяти, стек и т. Д. Идея состоит в том, чтобы работать в более безопасной среде.
Чтобы преобразовать, скажем, из управляемой переменной в неуправляемую переменную, вам нужно перейти к самому реальному объекту. Он, вероятно, упакован или упакован в какую-то дополнительную упаковку. Неуправляемые переменные (например, int) на 32-битной машине занимают ровно 4 байта. Нет накладных расходов или дополнительной упаковки. Процесс перехода от управляемого к неуправляемому коду - и обратно - называется " маршалинг ". Это позволяет вашим программам пересекать границу.