В чем разница в управляемом и неуправляемом коде, памяти и размере?

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

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

Ответ 1

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

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

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

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

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

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

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

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

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

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

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

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

Что относительно собственного кода?

Собственный код фразы используется в двух контекстах. Многие используют его как синоним неуправляемого кода: код, построенный со старым инструментом или преднамеренно выбранный в Visual С++, который не запускается во время выполнения, а вместо этого запускается изначально на машине. Это может быть полное приложение, или это может быть COM-компонент или DLL, вызываемый из управляемого кода с помощью COM Interop или PInvoke, двух мощных инструментов, которые позволяют использовать старый код при переходе в новый мир. Я предпочитаю говорить. Управляемый код. для этого значения, поскольку он подчеркивает, что код не получает службы среды выполнения. Например, защита кода доступа в управляемом коде предотвращает выполнение кода, загруженного с другого сервера, на выполнение определенных деструктивных действий. Если ваше приложение вызывает неуправляемый код, загруженный с другого сервера, вы не получите эту защиту.

Другое использование родного кода фразы - описание вывода компилятора JIT, машинного кода, который фактически выполняется во время выполнения. Это удалось, но это не CIL, это машинный код. В результате не просто предположите, что native = неуправляемый.

(Источник)

Ответ 2

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

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

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

Ответ 3

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

Ответ 4

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

Ответ 5

Неуправляемый код: -

1. Код, разработанный за пределами .NET, Framework известен как неуправляемый код.

2. Приложения, которые не запускаются под управлением CLR, называются неуправляемыми, и для написания таких приложений могут использоваться определенные языки, такие как C++, которые, например, получают доступ к низкоуровневым функциям операционной системы. Фоновая совместимость с кодом VB, ASP и COM являются примерами неуправляемого кода.

3. Неуправляемый код выполняется с помощью классов-оболочек.

4. Классы обертки бывают двух типов: CCW (COM Callable Wrapper) и RCW (Обрабатываемая Callable Wrapper).

5. Обертка используется для покрытия разницы с помощью CCW и RCW. Управляемый код Ресурс, находящийся в домене вашего приложения, - это управляемый код. Ресурсы внутри домена работают быстрее.

Управляемый код 1.Код, разработанный в .NET Framework, называется управляемым кодом. Этот код напрямую выполняется CLR с помощью выполнения управляемого кода. Любой язык, написанный на .NET Framework, является управляемым кодом.

2. Управляемый код использует CLR, который, в свою очередь, следит за вашими приложениями, управляя памятью, управляя безопасностью, разрешая отладку на разных языках и так далее.

Ответ 6

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

  

un-managed apps

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

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