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


151

Я использую определенную команду в моем коде C #, который работает хорошо. Тем не менее, говорят, что он плохо себя ведет в «неуправляемом» коде.

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


Ответы:


75

Вот некоторый текст из MSDN о неуправляемом коде .

Некоторый библиотечный код должен вызывать неуправляемый код (например, API нативного кода, такие как Win32). Поскольку это означает выход за пределы периметра безопасности для управляемого кода, требуется должная осторожность.

Вот еще одно бесплатное объяснение управляемого кода:

  • Код, который выполняется CLR.
  • Код, предназначенный для общеязыковой среды выполнения, являющейся основой .NET Framework, называется управляемым кодом.
  • Управляемый код предоставляет метаданные, необходимые для CLR для предоставления таких услуг, как управление памятью, межязыковая интеграция, безопасность доступа к коду и автоматический контроль жизненного цикла объектов. Весь код на основе IL выполняется как управляемый код.
  • Код, который выполняется в среде выполнения CLI.

Для вашей проблемы:

Я думаю, это потому, что NUnit выполняет ваш код для UnitTesting и может иметь некоторую его часть, которая неуправляема. Но я не уверен в этом, поэтому не принимайте это за золото. Я уверен, что кто-то сможет дать вам больше информации об этом. Надеюсь, поможет!


12
Я ценю усилия, прилагаемые к вашему ответу. но люди, которые не знают, что такое «управляемый код», будут бороться с тем, что вы имеете в виду в своем ответе: они не будут знать: «код библиотеки», «неуправляемый код», «API собственного кода», CLR, основа .net Framework, IL, среда исполнения CLI и т. д. и т. д.
BKSpurgeon

201

Это хорошая статья на эту тему.

Подвести итоги,

  1. Управляемый код компилируется не в машинный код, а в промежуточный язык, который интерпретируется и выполняется какой-либо службой на машине и, следовательно, работает в (надежно!) Защищенной среде, которая обрабатывает такие опасные вещи, как память и потоки. В современном использовании это часто означает .NET, но не обязательно.

Прикладная программа, которая выполняется в среде выполнения, установленной на том же компьютере. Приложение не может работать без него. Среда выполнения предоставляет общую библиотеку программных подпрограмм, которая используется программой и обычно выполняет управление памятью. Он также может обеспечивать преобразование JIT в исходное время в исполняемый код или из промежуточного языка в исполняемый код. Java, Visual Basic и .NET Common Language Runtime (CLR) являются примерами модулей времени выполнения. ( Читать дальше )

  1. Неуправляемый код компилируется в машинный код и поэтому выполняется непосредственно ОС. Поэтому у него есть возможность делать вредные / мощные вещи, которыми не управляет код. Так все работало, поэтому обычно это связано со старыми вещами, такими как .dll.

Исполняемая программа, которая запускается сама по себе. Запущенная из операционной системы, программа вызывает и использует программные процедуры в операционной системе, но не требует использования другой программной системы. Программы на языке ассемблера, которые были собраны на машинном языке, и программы на C / C ++, скомпилированные на машинном языке для конкретной платформы, являются примерами неуправляемого кода. ( Читать дальше )

  1. Собственный код часто является синонимом Unmanaged, но не идентичен.

Вы имеете в виду, что при взломе мы не можем использовать .net langauge (C #, C ++), верно?
Haroon A.

7
@H_wardak что вы определяете как «взлом»? это очень общий термин, это все равно что сказать взломать NORAD и взломать некоторые регистры одинаково.
Алекс

7
Меня однажды спросил интервьюер, можем ли мы запустить / написать неуправляемый код на C #? Кто-нибудь может помочь в этом?
RSB

9
@RSB: Вы не можете писать неуправляемый код в C # (хотя вы можете напрямую вызывать неуправляемый код из C #). Теоретически, с правильным компилятором и фреймворком, вы могли бы сделать это, я думаю. На практике это означает, что вам нужен компилятор, который может компилировать C # в машинный код напрямую. Не уверен, как это будет работать.
Джеймс Хауг

67

Когда вы думаете о неуправляемом , подумайте о машинном коде машинного уровня. Как х86 на ассемблере. Неуправляемый (нативный) код компилируется и связывается для запуска непосредственно на процессоре, для которого он был разработан, исключая все компоненты ОС на данный момент. Это не портативный, но это быстро. Очень простой, урезанный код.

Управляемый код - это все, от Java до старой интерпретирующей BASIC, или все, что работает под .NET. Управляемый код обычно компилируется в P-код промежуточного уровня или набор инструкций байтового кода. Это не машинно-ориентированные инструкции, хотя они похожи на язык ассемблера. Управляемый код изолирует программу от машины, на которой она выполняется, и создает безопасную границу, в которой вся память выделяется косвенно, и, вообще говоря, у вас нет прямого доступа к ресурсам машины, таким как порты, адресное пространство памяти, стек и т. Д. Идея состоит в том, чтобы работать в более безопасной среде.

Чтобы преобразовать управляемую переменную, скажем, в неуправляемую, вам нужно перейти к самому реальному объекту. Он, вероятно, упакован или упакован в какую-то дополнительную упаковку. Неуправляемые переменные (например, int) на 32-битной машине занимают ровно 4 байта. Там нет накладных или дополнительной упаковки. Процесс перехода от управляемого к неуправляемому коду и обратно - называется « маршалинг ». Это позволяет вашим программам пересекать границу.


1
Как тогда смешивание взаимодействует со значениями и ссылочными типами? Я помню, что видел что-то про MarshalByRefObject, например.
Кайл Баран

24

Как можно меньше слов:

  • управляемый код = .NET программы
  • неуправляемый код = "нормальные" программы

16
программа .NET не "нормальная"?
jtate

1
@jtate - Да, немного тупо. :) Я пытался сделать это более интуитивным. Во всяком случае, это было более 8 лет назад. Сегодня, когда существует множество языков программирования, широко распространенных в повседневной жизни, это различие действительно еще более неточно, да.
Vilx

5

Управляемый код - это то, что создают компиляторы C # .Net, VB.Net, F # .Net и т. Д. Он работает на CLR, который, помимо прочего, предлагает такие услуги, как сборка мусора, проверка ссылок и многое другое. Так что подумайте, мой код управляется CLR.

С другой стороны, неуправляемый код компилируется прямо в машинный код. Это не управляет CLR.


4

По сути, неуправляемый код - это код, который не запускается под .NET CLR (он же не VB.NET, C # и т. Д.). Я предполагаю, что в NUnit есть runner / wrapper, который не является кодом .NET (он же C ++).


4

Управляемый код:
код, который работает по «договору о сотрудничестве» с общеязыковой средой исполнения. Управляемый код должен предоставлять метаданные, необходимые для среды выполнения, чтобы предоставлять такие услуги, как управление памятью, межязыковая интеграция, безопасность доступа к коду и автоматический контроль времени жизни объектов. Весь код, основанный на промежуточном языке Microsoft (MSIL), выполняется как управляемый код.

Неуправляемый код:
код, созданный без учета соглашений и требований общеязыковой среды выполнения. Неуправляемый код выполняется в общеязыковой среде выполнения с минимальным количеством служб (например, без сборки мусора, ограниченной отладки и т. Д.).

Ссылка: http://www.dotnetspider.com/forum/11612-difference-between-managed-and-unmanaged-code.aspx


3

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


2

Управляемый код выполняется внутри среды CLR, т.е. среды выполнения .NET. Короче говоря, все IL являются управляемым кодом. Но если вы используете какое-либо стороннее программное обеспечение, например компонент VB6 или VC ++, они являются неуправляемым кодом, поскольку среда выполнения .NET (CLR) не имеет контроля над исполнением исходного кода языка.


1

Управляемый код: - код, форма MSIL (промежуточный язык) которого разрабатывается после компиляции языкового компилятора и непосредственно выполняется CLRвызываемым управляемым кодом. Например: - Весь код на 61 языке поддерживается .net Framework

Неуправляемый код: - разработанный ранее код, .netдля которого форма MSIL недоступна и выполняется CLRнапрямую, скорее всего CLR, перенаправит в операционную систему, которая называется неуправляемым кодом.

Например: -COM, Win32 API


В этом посте есть ряд ошибок. Наиболее очевидно MISL (вы имеете в виду MSIL).
Мэтт Сеймур

1
  • Управляемый код: код, написанный на языке .NET, например C #, VB.NET.
  • Неуправляемый код: код написан не на языке .NET и MSIL не понимает, что это такое, и не может работать под CLR; как сторонние элементы управления, которые мы использовали в наших приложениях .NET, которые не созданы на языках .NET.

0

Прежде всего это понять, перед тем .NET framework, Microsoftобеспечивали автономные продукты , как и MFC (Visual C++), VB, FoxProт.д.

В 2002 году Microsoft объединила свои продукты и сделала .NET Framework. Теперь есть разница между тем, как код выполнялся раньше, и тем, как код управляется и выполняется в .NET Framework. Microsoft представила концепцию CLR.NET Framework, которая компилирует код, поступающий из любого поддерживаемого языка .NET Framework, и предоставляет дополнительные функции, подобные memory mangement, garbage collectionт. Д. Но такие функции CLR ранее не были доступны напрямую.

Так что если вы создаете библиотеку / код в .NET Framework (скомпилирован с CLR), то это называется Managed code. Вы можете использовать эту библиотеку в других приложениях / проектах .NET, и там CLR поймет, как она была скомпилирована ранее, и поэтому она остается вашим кодом управления.

OTOH, если вы хотите использовать библиотеки, которые были написаны до .NET Framework, вы можете сделать это с определенными ограничениями, но помните, поскольку CLR не было в то время, поэтому теперь CLR не будет понимать и компилировать этот код снова , И это будет называться unmanaged code. Обратите внимание, что библиотеки / сборки, созданные какой-либо третьей стороной для предоставления определенных функций / инструментов, также могут рассматриваться как неуправляемый код, если он не совместим с CLR.

С точки зрения непрофессионала, Manage code - это то, что ваш CLR понимает и может скомпилировать его самостоятельно для дальнейшего выполнения. В .NET Framework (из любого языка, который работает на .NET Framework) Когда код переходит в CLR, код предоставляет некоторую метаданную, чтобы CLR мог предоставить вам функции, указанные здесь . Немногие из них и Garbage collection, Performance improvements, cross-language integration, memory managementт. Д.

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


Боюсь, много-много-много неосведомленного мнения. Это может быть неожиданностью, но CLR также может выполнять неуправляемый код (обычно написанный на C ++ / CLI). Также не требуется, чтобы управляемый код был доступен как IL. .NET Native существует уже некоторое время и поставляется с предварительно скомпилированными сборками. То, что вы называете «CLR-совместимым» , вероятно, подразумевается «CLS-совместимым» . Несоблюдение требований CLS не делает внезапно управляемый код неуправляемым. Использование неуправляемого кода, несмотря на ваше описание, также довольно просто (RCW через COM, P / Invoke, C ++ / CLI и т. Д.).
Инспектируемый

0

Из Pro C # 5 и .NET 4.5 Framework:

Управляемый и неуправляемый код. Возможно, наиболее важным моментом, который необходимо понять о языке C #, является то, что он может создавать код, который может выполняться только в среде выполнения .NET (вы никогда не сможете использовать C # для создания собственного COM-сервера или неуправляемого C / C ++. применение). Официально термин, используемый для описания кода, предназначенного для среды выполнения .NET, - это управляемый код. Двоичный модуль, который содержит управляемый код, называется сборкой (подробнее о сборках чуть ниже). И наоборот, код, который не может быть непосредственно размещен в среде выполнения .NET, называется неуправляемым кодом.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.