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



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



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

1061   5  

5 ответов:

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

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

ответ:

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

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

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

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

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

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

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

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

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

как насчет собственного кода?

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

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

(источник)

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

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

управляемый код-это код, который выделяет память в куче мусора.

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

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

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

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

в то время как приложения, которые работают под .NET framework известны как

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

Comments

    Ничего не найдено.