it-roy-ru.com

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

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

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

137
Pokus

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

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

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

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

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

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

70
Patrick Desjardins

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

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

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

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

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

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

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

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

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

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

64
TJPowell

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

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

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

5
joegtp

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

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

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

4
GMalla

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

3
leppie

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

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

3
Arif

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

2
chirag Makwana

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

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

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

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

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

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

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

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

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

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

0
Amnesh Goel

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

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

0
arush436