Разница между "управляемым" и " неуправляемым"
Я иногда слышу/читаю об этом, когда говорю о .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 etc. Поскольку Visual C++ можно скомпилировать в управляемый или неуправляемый код, их можно смешать в одном приложении.