Что такое управляемый или неуправляемый код в программировании? - PullRequest
137 голосов
/ 02 декабря 2008

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

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

Ответы [ 13 ]

183 голосов
/ 02 декабря 2008

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

Подводя итог,

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

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

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

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

  1. Собственный код часто является синонимом Unmanaged, но не идентичен.
70 голосов
/ 02 декабря 2008

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

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

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

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

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

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

64 голосов
/ 04 сентября 2011

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

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

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

21 голосов
/ 02 декабря 2008

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

  • управляемый код = .NET программы
  • неуправляемый код = "нормальные" программы
5 голосов
/ 02 декабря 2008

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

4 голосов
/ 28 мая 2014

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

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

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

3 голосов
/ 22 декабря 2018

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

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

3 голосов
/ 02 декабря 2008

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

2 голосов
/ 09 октября 2010

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

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