В чем разница между управляемым и неуправляемым кодом, памятью и размером? - PullRequest
67 голосов
/ 30 июля 2010

После того, как я много видел и слушал об управляемом и неуправляемом коде и знал, что единственное отличие состоит в том, что управляемый - это CLR, а неуправляемый - вне CLR, мне действительно интересно узнать его подробно.Что это такое, управляемый и неуправляемый код, память и размер?

Как код, который я пишу на C #, может быть неуправляемым, в то время как это код на C #, и как память размера становится неуправляемой.Пример и немного понимания были бы полезны.

Ответы [ 5 ]

143 голосов
/ 30 июля 2010

Краткий ответ:

  • Управляемый код - это код .NET (VB.NET, C # и т. Д.), Который вы пишете и компилируете в .NET CIL .
  • Неуправляемый код - это код, который не входит в .NET и компилируется в прямой машинный код.

Длинный ответ:

ЧтоЯвляется ли управляемый код?

Управляемый код - это то, что создают компиляторы Visual Basic .NET и C #.Он компилируется в промежуточный язык (IL), а не в машинный код, который может работать непосредственно на вашем компьютере.CIL хранится в файле, называемом сборкой, вместе с метаданными, которые описывают классы, методы и атрибуты (например, требования безопасности) созданного вами кода.Эта сборка - единая единица развертывания в мире .NET.Вы копируете его на другой сервер, чтобы развернуть сборку там, и зачастую это копирование является единственным этапом, необходимым для развертывания.

Управляемый код выполняется в среде Common Language Runtime.Среда выполнения предлагает широкий спектр сервисов для вашего работающего кода.В обычном ходе событий сначала загружается и проверяется сборка, чтобы убедиться, что CIL в порядке.Затем, как раз во время вызова методов, среда выполнения организует их компиляцию в машинный код, подходящий для машины, на которой выполняется сборка, и кэширует этот машинный код для использования при следующем вызове метода.(Это называется Just In Time, или JIT-компиляцией, или часто просто Jitting.)

По мере выполнения сборки среда выполнения продолжает предоставлять такие службы, как безопасность, управление памятью, многопоточность и тому подобное.Приложение управляется средой выполнения.

Visual Basic .NET и C # могут создавать только управляемый код.Если вы работаете с этими приложениями, вы создаете управляемый код.Visual C ++ .NET может создавать управляемый код, если вам нравится: Когда вы создаете проект, выберите один из типов приложений, имя которого начинается с .Managed., Например .Managed C ++ application.

Что такое неуправляемый код?

Неуправляемый код - это то, что вы используете для создания до выпуска Visual Studio .NET 2002.Visual Basic 6, Visual C ++ 6, черт возьми, даже тот 15-летний компилятор C, который у вас все еще может иметь на своем жестком диске весь неуправляемый код.Он компилировался непосредственно в машинный код, который выполнялся на машине, где вы его скомпилировали, - и на других машинах, если они имели одинаковый чип или почти такой же.Он не получал такие сервисы, как безопасность или управление памятью из невидимой среды выполнения;он получил их от операционной системы.И что немаловажно, он получил их из операционной системы в явном виде, запросив их, обычно вызывая API, предоставленный в Windows SDK.Более поздние неуправляемые приложения получали сервисы операционной системы через вызовы COM.

В отличие от других языков Microsoft в Visual Studio, Visual C ++ может создавать неуправляемые приложения.Когда вы создаете проект и выбираете тип приложения, имя которого начинается с MFC, ATL или Win32, вы создаете неуправляемое приложение.

Это может привести к некоторой путанице: при создании приложения .Managed C ++., продукт сборки представляет собой сборку CIL с расширением .exe.При создании приложения MFC продукт сборки представляет собой исполняемый файл Windows с собственным кодом, также с расширением .exe.Внутреннее расположение двух файлов совершенно разное.Вы можете использовать промежуточный языковой дизассемблер, ildasm, чтобы заглянуть внутрь сборки и увидеть метаданные и CIL.Попробуйте указать ildasm на неуправляемый exe-файл, и вам скажут, что у него нет действительного заголовка CLR (Common Language Runtime) и его нельзя разобрать - то же расширение, совершенно разные файлы.

А как насчет Native Code?1035 * Фраза нативный код используется в двух контекстах.Многие люди используют его в качестве синонима для неуправляемого кода: кода, созданного с помощью более старого инструмента или намеренно выбранного в Visual C ++, который не запускается во время выполнения, а вместо этого работает на компьютере.Это может быть законченное приложение, или это может быть COM-компонент или DLL, которые вызываются из управляемого кода с помощью COM Interop или PInvoke, двух мощных инструментов, которые гарантируют, что вы сможете использовать свой старый код при переходе в новый мир.Я предпочитаю говорить. Неуправляемый код.для этого значения, потому что он подчеркивает, что код не получает службы среды выполнения.Например, Code Access Security в управляемом коде не позволяет коду, загруженному с другого сервера, выполнять определенные разрушительные действия.Если ваше приложение вызывает неуправляемый код, загруженный с другого сервера, вы не получите эту защиту. Другое использование нативного кода фразы - это описание вывода компилятора JIT, машинного кода, который на самом делеработает во время выполнения.Управляется, но это не CIL, это машинный код.В результате не просто предполагайте, что native = неуправляемый. ( Source )

7 голосов
/ 30 июля 2010

Это может быть очень длинный ответ, говорящий о многих тонких различиях между машинным кодом, сгенерированным компилятором C, и машинным кодом, сгенерированным JIT-компилятором из управляемой программы.Достаточно долго, чтобы действительно требовать книгу, но такие книги уже написаны.Что-нибудь от Джеффри Рихтера, например.

Я буду кратким и резким, потому что все эти тонкие различия сводятся к одному правилу:

Управляемый код - это код, который выделяет памятьиз кучи собранного мусора.

1 голос
/ 28 марта 2014

Управляемый код выполняется в домене приложения, а неуправляемый код выполняется в операционной системе.

1 голос
/ 30 июля 2010

Обычно управляемый код занимает больше места во время выполнения, чем эквивалентный хорошо написанный неуправляемый (собственный) код.

0 голосов
/ 20 марта 2018

Приложения, которые запускаются непосредственно под ОС, известны как

неуправляемые приложения

тогда как приложения, работающие в среде .net, известны как

управляемые приложения

...