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

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

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 etc. Поскольку Visual C++ можно скомпилировать в управляемый или неуправляемый код, их можно смешать в одном приложении.