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

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

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

12 ответов


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

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

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

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

проблемы:

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


этой хорошая статья о предмете.

шпаргалка:

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

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

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


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

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

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


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

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

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


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


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

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

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


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


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

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

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


  • управлял код: код, написанный на языке .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.

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


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

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