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!
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
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 )
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 )
Código nativo geralmente é sinônimo de Não gerenciado, mas não é idêntico.
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.
@ 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.
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 ++).
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).
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.
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.
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.
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.
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.
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.
Respostas:
Aqui está um texto do MSDN sobre código não gerenciado .
Aqui estão outras explicações complementares sobre o código gerenciado:
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!
fonte
Este é um bom artigo sobre o assunto.
Para resumir,
fonte
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.
fonte
No menor número de palavras possível:
fonte
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.
fonte
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 ++).
fonte
Referência: http://www.dotnetspider.com/forum/11612-difference-between-managed-and-unmanaged-code.aspx
fonte
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.
fonte
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.
fonte
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
CLR
código gerenciado chamado. por exemplo: - Todo o código de 61 idiomas suportado pela estrutura .netCódigo não gerenciado: - o código desenvolvido anteriormente
.net
para o qual o formulário MSIL não está disponível e é executadoCLR
diretamente, em vez disso,CLR
será redirecionado para o sistema operacional, conhecido como código não gerenciado.por exemplo: -COM, APIs do Win32
fonte
fonte
Antes de tudo, entendamos que, antes
.NET framework
,Microsoft
fornecíamos produtos independentes, comoMFC (Visual C++), VB, FoxPro
etc.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 comomemory mangement, garbage collection
etc. Mas esses recursos CLR não estavam disponíveis diretamente antes.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 management
etc.OTOH, código não gerenciado é algo específico para a máquina e pronto para uso, sem necessidade de processá-lo ainda mais.
fonte
Do Pro C # 5 e do .NET 4.5 Framework:
fonte