Я иногда слышу/читаю об этом, когда говорю о .NET, например "управляемый код" и "неуправляемый код", но я понятия не имею, что это такое и каковы их отличия. В чем их отличие, по определению? Каковы последствия использования любого из них? Разве это различие существует только в .NET/Windows?
Разница между "управляемыми" и "неуправляемыми"
Ответ 1
Управляемый код
Управляемый код - это то, что создают компиляторы Visual Basic.NET и С#. Он работает на CLR (Common Language Runtime), который, среди прочего, предлагает такие услуги, как сбор мусора, проверка времени выполнения и проверка ссылок. Итак, подумайте, как: "Мой код управляется CLR".
Visual Basic и С# могут создавать только управляемый код, поэтому, если вы пишете приложение на одном из этих языков, вы пишете приложение, управляемое CLR. Если вы пишете приложение в Visual С++.NET, вы можете создать управляемый код, если хотите, но он необязательный.
Неуправляемый код
Неуправляемый код компилируется прямо в машинный код. Таким образом, по этому определению весь код, составленный традиционными компиляторами C/С++, является "неуправляемым кодом". Кроме того, поскольку он компилируется в машинный код, а не на промежуточном языке, он не переносится.
Нет свободного управления памятью или чего-либо еще, что предоставляет CLR.
Поскольку вы не можете создать неуправляемый код с Visual Basic или С#, в Visual Studio весь неуправляемый код написан на C/С++.
Смешивание двух
Поскольку Visual С++ может быть скомпилирован как с управляемым, так и с неуправляемым кодом, можно смешать два в одном приложении. Это размывает линию между ними и усложняет определение, но стоит упомянуть только о том, что вы все равно можете потерять память, если, например, вы используете стороннюю библиотеку с плохо написанным неуправляемым кодом.
Вот пример, который я нашел googling:
#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;
}
Ответ 2
Это более общий, чем .NET и Windows. Управляемый - это среда, в которой у вас есть автоматическое управление памятью, сбор мусора, безопасность типов,... неуправляемое - это все остальное. Так, например,.NET является управляемой средой, а C/С++ неуправляемым.
Ответ 3
Управляемый код - это дифференциация, разработанная Microsoft для определения кода компьютерной программы, который требует и будет выполняться только под управлением "виртуальной машины времени обычного языка" (в результате получается Bytecode).
Ответ 4
Управляемый код - это код, который записывается для таргетинга сервисов среды выполнения управляемой среды выполнения, такой как время выполнения Common Language Runtime в .Net Technology.
Управляемый код, работающий под управлением Common Language Runtime, не может быть доступен за пределами среды выполнения, а также не может вызывать непосредственно извне среды выполнения. Это относится к договору о сотрудничестве между исполняемым кодом и временем выполнения. Он предлагает такие услуги, как сбор мусора, проверка типа времени выполнения, проверка ссылок и т.д. Используя управляемый код, вы можете избежать многих типичных ошибок программирования, которые приводят к нарушениям безопасности и нестабильным приложениям, также автоматически заботятся многие непроизводительные задачи программирования, такие как проверка безопасности типов, управление памятью, уничтожение неиспользуемых объектов и т.д.
Что такое неуправляемый код?
Неуправляемый код компилируется прямо в машинный код и непосредственно выполняется операционной системой. Сгенерированный код выполняется изначально на главном процессоре, и процессор непосредственно выполняет код, сгенерированный компилятором. Он всегда скомпилирован для ориентации на определенную архитектуру и будет работать только на предполагаемой платформе. Итак, если вы хотите запустить тот же код в другой архитектуре, вам придется перекомпилировать код с использованием этой конкретной архитектуры.
Неуправляемые исполняемые файлы в основном представляют собой двоичное изображение, x86-код, непосредственно загружаемый в память. Такой подход обычно приводит к быстрому выполнению кода, но диагностика и восстановление от ошибок могут быть сложными и трудоемкими в большинстве случаев. Программисту необходимо позаботиться о распределении памяти, типе безопасности, безопасности и т.д., И это приведет к неуправляемому коду, подверженному утечкам памяти, таким как переполнение буфера, переопределение указателей и т.д.
Весь код, составленный традиционными компиляторами C/С++, является неуправляемым кодом. Компоненты COM, интерфейсы ActiveX и функции API Win32 являются примерами неуправляемого кода. Управляемый код - это код, написанный на многих языках программирования высокого уровня, которые доступны для использования с Microsoft.NET Framework, включая VB.NET, С#, J #, JScript.NET и т.д. Так как Visual С++ может быть скомпилирован как с управляемым, так и с неуправляемым кодом можно смешать два в одном приложении.