Разница между "управляемым" и " неуправляемым"


Я иногда слышу/читаю об этом, когда говорю о .NET, например "управляемый код" и "неуправляемый код", но я понятия не имею, что это такое и каковы их различия. В чем их отличие, по определению? Каковы последствия использования любого из них? Существует ли это различие только в .NET/Windows?

4 129

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 для идентификации кода компьютерной программы, который требует и будет выполняться только под "управлением" виртуальной машины Общеязыковой среды выполнения (что приводит к байт-коду).

http://en.wikipedia.org/wiki/Managed_code

http://www.developer.com/net/cplus/article.php/2197621/Managed-Unmanaged-Native-What-Kind-of-Code-Is-This.htm

управляемый код-это код, написанный для целевых служб среды выполнения управляемой среды выполнения, такой как Общеязыковая среда выполнения в технологии .Net.

управляемый код, выполняемый в Общеязыковой среде выполнения, не может быть доступен вне среды выполнения, а также не может быть вызван непосредственно из среды выполнения. Это относится к Договору о сотрудничестве между изначально выполняемым кодом и средой выполнения. Он предлагает такие услуги, как сбор мусора, проверка типа времени выполнения, проверка ссылок и т. д. С помощью управляемого кода Вы можете избежать многих типичных ошибок программирования, которые приводят к дырам в безопасности и нестабильным приложениям, а также автоматически решаются многие непродуктивные задачи программирования, такие как проверка безопасности типов, управление памятью, уничтожение неиспользуемых объектов и т. д.

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

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

неуправляемые исполняемые файлы в основном представляют собой двоичный образ, x86 код, непосредственно загруженный в память. Этот подход обычно это приводит к быстрому выполнению кода, но в большинстве случаев диагностика и восстановление после ошибок могут быть сложными и трудоемкими. Программист должен позаботиться о выделении памяти, безопасности типа, безопасности и т. д., И это приведет к неуправляемому коду, склонному к утечкам памяти, таким как переполнение буфера, переопределение указателя и т. д.

весь код, скомпилированный традиционными компиляторами C / C++, является неуправляемым кодом. Com-компоненты, интерфейсы ActiveX и функции Win32 API являются примерами неуправляемый код. Управляемый код-это код, написанный на многих языках программирования высокого уровня, доступных для использования с Microsoft .NET Framework, включая VB.NET, C#, J#, JScript.NET и т.д. Поскольку Visual C++ может быть скомпилирован в управляемый или неуправляемый код, можно смешать их в одном приложении.