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


Я использую Assembly.GetEntryAssembly()... в моем коде C# получить версию приложения. Он работает нормально, но когда я пытаюсь его в NUnit он возвращает NULL. В MSDN он заявляет, что он может вернуть NULL при вызове из неуправляемого кода.

что такое управляемый и неуправляемый код? Я не понимаю.

12 127

12 ответов:

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

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

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

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

проблемы:

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

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

шпаргалка:

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

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

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

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

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

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

в качестве несколько слов, как это возможно:

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

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

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

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

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

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

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

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

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

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

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

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

в 2002 году Microsoft объединила свои продукты и сделала .NET framework. Теперь есть разница между тем, как код был выполнен раньше и как код управляется и выполняется в .NET framework. Microsoft представила концепцию CLR С .NET framework, который компилирует код, поступающий из любого поддерживаемого lanugague .NET framework и предоставляет дополнительные функциональные возможности, как memory mangement, garbage collection etc. Но, такие функции 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 etc.

ото unmanged code что-то специфическое к машине и подготавливает для использования, никакая потребность обрабатывать его более далее.

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

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