.net Diferença entre “gerenciado” e “não gerenciado”




windows unmanaged (4)

Isso é mais geral que o .NET e o Windows. Gerenciado é um ambiente em que você tem gerenciamento automático de memória, coleta de lixo, segurança de tipo, ... não gerenciado é tudo o resto. Por exemplo, o .NET é um ambiente gerenciado e o C / C ++ não é gerenciado.

Eu ouço / leio sobre isso algumas vezes quando falo em .NET, por exemplo, "código gerenciado" e "código não gerenciado", mas não tenho idéia do que são e quais são suas diferenças. Quais são suas diferenças, por definição? Quais são as consequências do uso de qualquer um deles? Essa distinção existe apenas no .NET / Windows?



Código gerenciado

O código gerenciado é o que os compiladores Visual Basic .NET e C # criam. Ele é executado no CLR (Common Language Runtime), que, entre outras coisas, oferece serviços como coleta de lixo, verificação de tipo de tempo de execução e verificação de referência. Então, pense nisso como "Meu código é gerenciado pelo CLR".

Visual Basic e C # podem produzir código gerenciado, portanto, se você estiver escrevendo um aplicativo em um desses idiomas, você está escrevendo um aplicativo gerenciado pelo CLR. Se você estiver escrevendo um aplicativo no Visual C ++ .NET, poderá produzir código gerenciado, se desejar, mas é opcional.

Código não gerenciado

Código não gerenciado compila diretamente para código de máquina. Assim, por essa definição, todo o código compilado pelos compiladores C / C ++ tradicionais é 'código não gerenciado'. Além disso, uma vez que compila para código de máquina e não uma linguagem intermediária, não é portátil.

Nenhum gerenciamento de memória livre ou qualquer outra coisa que o CLR fornece.

Como você não pode criar código não gerenciado com Visual Basic ou C #, no Visual Studio todo o código não gerenciado é gravado em C / C ++.

Misturando os dois

Como o Visual C ++ pode ser compilado para código gerenciado ou não gerenciado, é possível misturar os dois no mesmo aplicativo. Isso desfoca a linha entre os dois e complica a definição, mas vale a pena mencionar apenas para que você saiba que ainda pode haver vazamentos de memória se, por exemplo, estiver usando uma biblioteca de terceiros com algum código não gerenciado mal escrito.

Aqui está um exemplo que encontrei 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;
}

Código gerenciado é o código que é gravado para direcionar os serviços do ambiente de execução de tempo de execução gerenciado, como Common Language Runtime na .Net Technology.

O Código Gerenciado em execução sob um Common Language Runtime não pode ser acessado fora do ambiente de tempo de execução, bem como não pode chamar diretamente de fora do ambiente de tempo de execução. Refere-se a um contrato de cooperação entre o código de execução nativa e o tempo de execução. Ele oferece serviços como coleta de lixo, verificação de tipo de tempo de execução, verificação de referências, etc. Usando código gerenciado você pode evitar muitos erros típicos de programação que levam a falhas de segurança e aplicativos instáveis, e muitas tarefas de programação improdutivas são automaticamente atendidas. como tipo de verificação de segurança, gerenciamento de memória, destruição de objetos não utilizados, etc.

O que é código não gerenciado?

O código não gerenciado é compilado diretamente no código da máquina e executado diretamente pelo sistema operacional. O código gerado é executado nativamente no processador host e o processador executa diretamente o código gerado pelo compilador. Ele é sempre compilado para segmentar uma arquitetura específica e só será executado na plataforma pretendida. Portanto, se você deseja executar o mesmo código em arquitetura diferente, será necessário recompilar o código usando essa arquitetura específica.

Arquivos executáveis ​​não gerenciados são basicamente uma imagem binária, código x86, carregada diretamente na memória. Essa abordagem normalmente resulta na execução mais rápida de código, mas o diagnóstico e a recuperação de erros podem ser difíceis e demorados na maioria dos casos. A alocação de memória, tipo de segurança, segurança, etc precisa ser cuidada pelo programador e isso levará código não gerenciado propenso a vazamentos de memória como saturações de buffer, substituições de ponteiro etc.

Todo o código compilado pelos compiladores C / C ++ tradicionais é código não gerenciado. Componentes COM, interfaces ActiveX e funções de API do Win32 são exemplos de código não gerenciado. Código gerenciado é código escrito em muitas linguagens de programação de alto nível que estão disponíveis para uso com o Microsoft .NET Framework, incluindo VB.NET, C #, J #, JScript.NET etc. Desde que o Visual C ++ pode ser compilado para código gerenciado ou não gerenciado é possível misturar os dois no mesmo aplicativo.





managed