Разница между "управляемым" и " неуправляемым"
Я иногда слышу/читаю об этом, когда говорю о .NET, например "управляемый код" и "неуправляемый код", но я понятия не имею, что это такое и каковы их различия. В чем их отличие, по определению? Каковы последствия использования любого из них? Существует ли это различие только в .NET/Windows?
4 ответа:
Управляемого Кода
управляемый код-это то, что создают компиляторы Visual Basic .NET и C#. Он работает в среде CLR (Common Language Runtime), которая, среди прочего, предлагает такие службы, как сбор мусора, проверка типов во время выполнения и проверка ссылок. Итак, подумайте об этом так: "мой код управлял по CLR."
Visual Basic и C# can только создать управляемый код, так что, если вы пишете приложение на одном из тех языков, которые вы пишете приложение, управляемое средой CLR. Если вы пишете приложение в Visual C++ .NET, вы можете создать управляемый код, если хотите, но это необязательно.
Неуправляемый Код
неуправляемый код компилируется прямо в машинный код. Таким образом, по этому определению весь код, скомпилированный традиционными компиляторами C/C++, является "неуправляемым кодом". Кроме того, поскольку он компилируется в машинный код, а не на промежуточный язык, он непереносим.
нет управления свободной памятью или что-нибудь еще CLR обеспечивает.
поскольку вы не можете создать неуправляемый код с помощью Visual Basic или C#, в Visual Studio весь неуправляемый код записывается на C/C++.
смешивание двух
поскольку Visual C++ может быть скомпилирован в управляемый или неуправляемый код, можно смешать их в одном приложении. Это размывает линию между ними и усложняет определение, но стоит упомянуть, чтобы вы знали, что у вас все еще могут быть утечки памяти, если, например, вы использование сторонней библиотеки с плохо написанным неуправляемым кодом.
вот пример, который я нашел погугли:
#using <mscorlib.dll> using namespace System; #include "stdio.h" void ManagedFunction() { printf("Hello, I'm managed in this section\n"); } #pragma unmanaged UnmanagedFunction() { printf("Hello, I am unmanaged through the wonder of IJW!\n"); ManagedFunction(); } #pragma managed int main() { UnmanagedFunction(); return 0; }
Это более общее, чем .NET и Windows. Управляемая-это среда, в которой есть автоматическое управление памятью, сбор мусора, безопасность типов ... все остальное неуправляемо. Так, например .Net является управляемой среде и C/C++ является неуправляемым.
управляемый код-это дифференциация, придуманная Microsoft для идентификации кода компьютерной программы, который требует и будет выполняться только под "управлением" виртуальной машины Общеязыковой среды выполнения (что приводит к байт-коду).
управляемый код-это код, написанный для целевых служб среды выполнения управляемой среды выполнения, такой как Общеязыковая среда выполнения в технологии .Net.
управляемый код, выполняемый в Общеязыковой среде выполнения, не может быть доступен вне среды выполнения, а также не может быть вызван непосредственно из среды выполнения. Это относится к Договору о сотрудничестве между изначально выполняемым кодом и средой выполнения. Он предлагает такие услуги, как сбор мусора, проверка типа времени выполнения, проверка ссылок и т. д. С помощью управляемого кода Вы можете избежать многих типичных ошибок программирования, которые приводят к дырам в безопасности и нестабильным приложениям, а также автоматически решаются многие непродуктивные задачи программирования, такие как проверка безопасности типов, управление памятью, уничтожение неиспользуемых объектов и т. д.
Что такое неуправляемый код ?
неуправляемый код компилируется прямо в машинный код и выполняется непосредственно в операционной системе. Этот сгенерированный код работает на хост-процессор и процессор непосредственно выполняет код, сгенерированный компилятором. Он всегда компилируется для целевой конкретной архитектуры и будет работать только на предназначенной платформе. Итак, если вы хотите запустить один и тот же код на другой архитектуре, вам придется перекомпилировать код, используя эту конкретную архитектуру.
неуправляемые исполняемые файлы в основном представляют собой двоичный образ, x86 код, непосредственно загруженный в память. Этот подход обычно это приводит к быстрому выполнению кода, но в большинстве случаев диагностика и восстановление после ошибок могут быть сложными и трудоемкими. Программист должен позаботиться о выделении памяти, безопасности типа, безопасности и т. д., И это приведет к неуправляемому коду, склонному к утечкам памяти, таким как переполнение буфера, переопределение указателя и т. д.
весь код, скомпилированный традиционными компиляторами C / C++, является неуправляемым кодом. Com-компоненты, интерфейсы ActiveX и функции Win32 API являются примерами неуправляемый код. Управляемый код-это код, написанный на многих языках программирования высокого уровня, доступных для использования с Microsoft .NET Framework, включая VB.NET, C#, J#, JScript.NET и т.д. Поскольку Visual C++ может быть скомпилирован в управляемый или неуправляемый код, можно смешать их в одном приложении.