O que é código gerenciado ou não gerenciado na programação?

150

Estou usando um comando específico no meu código c #, que funciona bem. No entanto, é dito que ele se comporta mal no código "não gerenciado".

O que é código gerenciado ou não gerenciado?

Pokus
fonte

Respostas:

75

Aqui está um texto do MSDN sobre código não gerenciado .

Algum código de biblioteca precisa chamar código não gerenciado (por exemplo, APIs de código nativo, como o Win32). Como isso significa sair do perímetro de segurança do código gerenciado, é necessário o devido cuidado.

Aqui estão outras explicações complementares sobre o código gerenciado:

  • Código que é executado pelo CLR.
  • O código que visa o Common Language Runtime, a base do .NET Framework, é conhecido como código gerenciado.
  • O código gerenciado fornece os metadados necessários para o CLR fornecer serviços como gerenciamento de memória, integração entre idiomas, segurança de acesso ao código e controle automático da vida útil dos objetos. Todo o código baseado em IL é executado como código gerenciado.
  • Código que é executado no ambiente de execução da CLI.

Para o seu problema:

Eu acho que é porque o NUnit executa seu código para UnitTesting e pode ter uma parte dele que não é gerenciada. Mas não tenho certeza, então não tome isso por ouro. Tenho certeza de que alguém poderá fornecer mais informações sobre isso. Espero que ajude!

Patrick Desjardins
fonte
12
Agradeço o esforço envidado em sua resposta. mas as pessoas que não sabem o que é "código gerenciado" terão dificuldades com o que você quer dizer com sua resposta: elas não saberão: "código da biblioteca", "código não gerenciado", "API de código nativo", CLR, o fundação do .NET framework, IL, ambiente de execução CLI etc etc
BKSpurgeon
200

Este é um bom artigo sobre o assunto.

Para resumir,

  1. O código gerenciado não é compilado no código da máquina, mas em uma linguagem intermediária que é interpretada e executada por algum serviço em uma máquina e, portanto, está operando em uma estrutura segura (espero!) Que lida com coisas perigosas como memória e threads para você. No uso moderno, isso freqüentemente significa .NET, mas não é necessário.

Um programa de aplicativo que é executado em um mecanismo de tempo de execução instalado na mesma máquina. O aplicativo não pode ser executado sem ele. O ambiente de tempo de execução fornece a biblioteca geral de rotinas de software que o programa usa e geralmente executa o gerenciamento de memória. Também pode fornecer conversão just-in-time (JIT) do código-fonte para o código executável ou de um idioma intermediário para o código executável. Java, Visual Basic e Common Language Runtime (CLR) do .NET são exemplos de mecanismos de tempo de execução. ( Leia mais )

  1. O código não gerenciado é compilado no código da máquina e, portanto, executado diretamente pelo sistema operacional. Portanto, ele tem a capacidade de fazer coisas prejudiciais / poderosas. O código gerenciado não. É assim que tudo costumava funcionar, por isso geralmente é associado a coisas antigas como .dlls.

Um programa executável que é executado sozinho. Lançado no sistema operacional, o programa chama e usa as rotinas de software no sistema operacional, mas não requer que outro sistema de software seja usado. Programas de linguagem assembly que foram montados em linguagem de máquina e programas C / C ++ compilados em linguagem de máquina para uma plataforma específica são exemplos de código não gerenciado ( Leia mais )

  1. Código nativo geralmente é sinônimo de Não gerenciado, mas não é idêntico.
annakata
fonte
você quer dizer que no hacking não podemos usar o .net langauge (C #, C ++), certo?
Haroon A.
7
@H_wardak, o que você define como 'hacking'? é um termo muito geral, é como dizer que invadir o NORAD e invadir alguns registros são os mesmos.
1028 Alex
7
Uma vez me perguntaram pelo entrevistador, podemos executar / escrever código não gerenciado em C #? Alguém pode ajudar nisso?
RSB
9
@RSB: Você não pode escrever código não gerenciado em C # (embora você possa chamar diretamente código não gerenciado em C #). Teoricamente, com o compilador e a estrutura certos, você poderia fazê-lo, eu acho. Na prática, isso significa que você precisaria de um compilador que pudesse compilar C # para código de máquina diretamente. Não tenho certeza de como isso funcionaria.
James Haug
67

Quando você pensa em não gerenciado , pense no código específico da máquina e no nível da máquina. Como linguagem assembly x86. O código não gerenciado (nativo) é compilado e vinculado para ser executado diretamente no processador para o qual foi projetado, excluindo todo o material do sistema operacional no momento. Não é portátil, mas é rápido. Código muito simples e simples.

Código gerenciado é tudo, desde Java ao antigo Interpretive BASIC, ou qualquer coisa que seja executada no .NET. O código gerenciado normalmente é compilado em um conjunto de instruções de código P de nível intermediário ou código de bytes. Essas instruções não são específicas da máquina, embora pareçam com a linguagem assembly. O código gerenciado isola o programa da máquina em que está sendo executado e cria um limite seguro no qual toda a memória é alocada indiretamente e, de um modo geral, você não tem acesso direto aos recursos da máquina, como portas, espaço de endereço da memória, pilha, etc. A idéia é executar em um ambiente mais seguro.

Para converter de uma variável gerenciada, digamos, para uma variável não gerenciada, você precisa acessar o próprio objeto real. Provavelmente está embrulhado ou embalado em algumas embalagens adicionais. Variáveis ​​não gerenciadas (como um 'int', por exemplo) - em uma máquina de 32 bits - levam exatamente 4 bytes. Não há sobrecarga ou embalagem adicional. O processo de passar do código gerenciado para o não gerenciado - e vice-versa - é chamado de " empacotamento ". Ele permite que seus programas ultrapassem os limites.

TJPowell
fonte
1
Como, então, o mashalling interage com os tipos de valor e referência? Lembro-me de ver algo sobre MarshalByRefObject, por exemplo.
Kyle Baran
24

No menor número de palavras possível:

  • código gerenciado = programas .NET
  • código não gerenciado = programas "normais"
Vilx-
fonte
16
um programa .NET não é "normal"?
Jtate # 10/17
1
@ jtate - Isso é emburrecer um pouco, sim. :) Eu estava tentando torná-lo mais intuitivo. Enfim, isso foi há mais de 8 anos. Hoje, com a miríade de linguagens de programação em uso diário comum, essa distinção é de fato ainda mais imprecisa, sim.
Vilx-
5

Código gerenciado é o que os compiladores C # .Net, VB.Net, F # .Net etc criam. É executado no CLR, que, entre outras coisas, oferece serviços como coleta de lixo e verificação de referências e muito mais. Então pense nisso, meu código é gerenciado pelo CLR.

Por outro lado, o código não gerenciado compila diretamente o código da máquina. Ele não gerencia pelo CLR.

Arif
fonte
4

Código basicamente não gerenciado é o código que não é executado no .NET CLR (também conhecido como VB.NET, C # etc.). Meu palpite é que o NUnit tem um corredor / invólucro que não é código .NET (também conhecido como C ++).

joegtp
fonte
4

Código gerenciado:
código executado sob um "contrato de cooperação" com o Common Language Runtime. O código gerenciado deve fornecer os metadados necessários para o tempo de execução para fornecer serviços como gerenciamento de memória, integração entre idiomas, segurança de acesso ao código e controle automático da vida útil dos objetos. Todo o código baseado na linguagem intermediária da Microsoft (MSIL) é executado como código gerenciado.

Código não gerenciado:
código criado sem considerar as convenções e requisitos do Common Language Runtime. O código não gerenciado é executado no ambiente de tempo de execução do idioma comum com serviços mínimos (por exemplo, sem coleta de lixo, depuração limitada e assim por diante).

Referência: http://www.dotnetspider.com/forum/11612-difference-between-managed-and-unmanaged-code.aspx

GMalla
fonte
3

O NUnit carrega os testes de unidade em um AppDomain separado e eu presumo que o ponto de entrada não esteja sendo chamado (provavelmente não é necessário), portanto, o assembly de entrada é nulo.

leppie
fonte
2

O código gerenciado é executado dentro do ambiente do CLR, ou seja, o tempo de execução do .NET. Em resumo, todos os IL são código gerenciado. sobre a execução do código fonte do idioma.

chirag Makwana
fonte
1

Código gerenciado: - código que formato MSIL (idioma intermediário) é desenvolvido após a compilação do compilador de idiomas e executado diretamente pelo CLRcódigo gerenciado chamado. por exemplo: - Todo o código de 61 idiomas suportado pela estrutura .net

Código não gerenciado: - o código desenvolvido anteriormente .netpara o qual o formulário MSIL não está disponível e é executado CLRdiretamente, em vez disso, CLRserá redirecionado para o sistema operacional, conhecido como código não gerenciado.

por exemplo: -COM, APIs do Win32

Ashok Narwal
fonte
Existem vários erros neste post. Obviamente, MISL (você quer dizer MSIL).
Matt Seymour
1
  • Código gerenciado : código escrito em linguagem .NET como C #, VB.NET.
  • Não gerenciado Código: código não escrito em linguagem .NET e não MSIL não entender o que é e não pode ser executado no CLR; como controles de terceiros que usamos em nossos aplicativos .NET que não são criados nos idiomas .NET.
Saket Kumar
fonte
0

Antes de tudo, entendamos que, antes .NET framework, Microsoftfornecíamos produtos independentes, como MFC (Visual C++), VB, FoxProetc.

Em 2002, a Microsoft combinou seus produtos e criou o framework .NET. Agora há uma diferença entre como o código foi executado antes e como o código é gerenciado e executado no .NET framework. A Microsoft introduziu o conceito do CLR.NET Framework, que compila o código proveniente de qualquer linguagem suportada do .NET Framework e fornece funcionalidades adicionais como memory mangement, garbage collectionetc. Mas esses recursos CLR não estavam disponíveis diretamente antes.

Portanto, se você estiver criando biblioteca / código no .NET framework (compilado com CLR), isso será chamado Managed code. Você pode usar essa biblioteca ainda mais em outro aplicativo / projeto .NET e, também, o CLR entenderá como foi compilada antes, e é por isso que permanece o seu código de gerenciamento.

OTOH, se você deseja usar as bibliotecas que foram escritas antes da estrutura .NET, pode fazer com certas limitações, mas lembre-se, como o CLR não estava lá naquele momento, agora o CLR não entenderá e compilará este código novamente . E isso será chamado unmanaged code. Observe que bibliotecas / assemblies criados por terceiros para fornecer determinados recursos / ferramentas também podem ser considerados como código não gerenciado se não for compatível com CLR.

Em termos leigos, o código Manage é algo que o seu CLR entende e pode compilá-lo por conta própria para posterior execução. No .NET framework, (de qualquer idioma que funcione no .NET framework). Quando o código for para o CLR, o código fornecerá algumas informações de metadados, para que o CLR possa fornecer os recursos especificados aqui . Poucos deles são Garbage collection, Performance improvements, cross-language integration, memory managementetc.

OTOH, código não gerenciado é algo específico para a máquina e pronto para uso, sem necessidade de processá-lo ainda mais.

Amnesh Goel
fonte
Muitas, muitas e muitas opiniões desinformadas, receio. Isso pode ser uma surpresa, mas o CLR também pode executar código não gerenciado (geralmente escrito em C ++ / CLI). Também não é necessário que o código gerenciado esteja disponível como IL. O .NET Native já existe há algum tempo e vem com assemblies pré-compilados. O que você chamou de "Compatível com CLR" provavelmente deve ser "Compatível com CLS" . O não cumprimento da conformidade com o CLS não torna o código gerenciado descontrolado, de repente. Consumir código não gerenciado - apesar da sua descrição - também é bastante fácil (RCW sobre COM, P / Invoke, C ++ / CLI etc.).
impraticável
0

Do Pro C # 5 e do .NET 4.5 Framework:

Código gerenciado versus não gerenciado: Talvez o ponto mais importante a ser entendido sobre a linguagem C # é que ela pode produzir código que pode ser executado apenas no tempo de execução do .NET (você nunca pode usar o C # para criar um servidor COM nativo ou um C / C ++ não gerenciado inscrição). Oficialmente, o termo usado para descrever o código destinado ao tempo de execução do .NET é código gerenciado. A unidade binária que contém o código gerenciado é denominada assembly (mais detalhes sobre os assemblies daqui a pouco). Por outro lado, o código que não pode ser hospedado diretamente pelo tempo de execução do .NET é denominado código não gerenciado.

arush436
fonte