O que é gerenciado ou código não gerenciado na programação?
-
22-07-2019 - |
Pergunta
Eu estou usando um comando específico no meu código C #, que funciona bem. No entanto, diz-se a se comportar mal em código "não gerenciado".
O que é gerenciado ou código não gerenciado?
Solução
Aqui está algum texto do MSDN sobre código não gerenciado .
Alguns código da biblioteca precisa chamar código não gerenciado (por exemplo, APIs de código nativo, como Win32). Porque isso significa ir para fora do perímetro de segurança para código gerenciado, é necessário a devida cautela.
Aqui está alguma outra explicação cortesia sobre o código gerenciado:
- O código que é executado pelo CLR.
- O código que alvos o Common Language Runtime, a fundação do .NET Framework, é conhecido como código gerenciado.
- suprimentos código gerenciado os metadados necessários para o CLR para fornecer serviços como gerenciamento de memória, a integração entre linguagens, segurança de acesso ao código, e controle vida automático de objetos. Todo o código baseado em executa IL como código gerenciado.
- código que executa sob o ambiente de execução CLI.
Para o seu problema:
Eu acho que é porque NUnit executar o seu código para UnitTesting e pode ter alguma parte dela que é gerenciado. Mas eu não tenho certeza sobre isso, então não leve isso para o ouro. Estou certo de que alguém será capaz de lhe dar mais informações sobre ele. Espero que ajude!
Outras dicas
Este é um bom artigo sobre o assunto.
Para resumir,
- O código gerenciado não é compilado para código de máquina, mas para uma linguagem intermediária que é interpretado e executado por algum serviço em uma máquina e, portanto, está operando dentro de uma (espero!) Quadro seguro que lida com coisas perigosas como memória e tópicos para você. No uso moderno, isto significa frequentemente NET, mas não precisa.
Um programa aplicativo que é executado dentro de um motor 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 do software rotinas que os usos do programa e tipicamente memória executa gestão. Ela também pode fornecer (JIT) conversão just-in-time de código fonte para código executável ou a partir de uma linguagem intermediária para código executável. Java, Visual Basic e Common Language Runtime do .NET (CLR) são exemplos de motores de tempo de execução. ( Leia mais )
- Código não gerenciado é compilado para código de máquina e, portanto, executado pelo OS diretamente. É, portanto, tem a capacidade de fazer danos / code coisas poderosas gerenciado não. Isto é como tudo usado para trabalho, então normalmente é associado com material antigo como .dlls.
Um programa executável que funciona por si. Lançado a partir da operação sistema, o programa convida e usa as rotinas de software no sistema operacional, mas não exige um outro sistema de software a ser usava. programas em assembly que foram montados na máquina programas de língua e C / C ++ compilado em linguagem de máquina para um em particular plataforma são exemplos de código não gerenciado. ( Leia mais )
- Native código é muitas vezes sinónimo de não gerenciado, mas não é idêntico.
Quando você pensa em não gerenciado , pense específico da máquina, o código de máquina de nível. Como a linguagem assembly x86. código não gerenciado (nativo) é compilado e ligado para rodar diretamente no processador foi projetado para, excluindo todas as coisas OS para o momento. Não é portátil, mas é rápido. Muito simples, despojado código.
Dirigido código é tudo de Java a idade Interpretativo BASIC, ou qualquer coisa que é executado sob .NET. Dirigido código é compilado tipicamente a um nível intermédio P-Code ou byte conjunto de códigos de instruções. Estes não são instruções específicas à máquina, embora semelhante à linguagem assembly. O código gerenciado isola o programa a partir da máquina que está sendo executado, e cria um limite seguro em que toda a memória é alocada indiretamente, e de um modo geral, você não tem acesso direto a recursos da máquina, como portas, espaço de endereçamento de memória, a pilha, etc . a ideia é executado em um ambiente mais seguro.
Para converter de uma variável conseguiu, digamos, a um já não gerenciado, você tem que chegar ao próprio objeto real. É provavelmente embalados ou acondicionados em algumas embalagens adicional. variáveis ??não gerenciados (como um 'int', por exemplo) - em uma máquina de 32 bits - leva exatamente 4 bytes. Não há embalagens sobrecarga ou adicional. O processo de ir de gerenciado para código não gerenciado - e vice-versa - é chamado de " empacotamento ". Ele permite que seus programas para atravessar a fronteira.
Em poucas palavras como possível:
- código gerenciado = .NET programas
- código não gerenciado = programas "normais"
código não gerenciado Basicamente é um código que não funciona sob o .NET CLR (aka não VB.NET, C #, etc.). Meu palpite é que NUnit tem um corredor / invólucro que não é código .NET (aka C ++).
Dirigido cupom:
Código que é executado sob um "contrato de cooperação" com o Common Language Runtime. O código gerenciado deve fornecer os metadados necessárias para a execução de prestação de serviços, como a memória gestão, integração entre linguagens, segurança de acesso ao código, e controlo vida automática dos objectos. Todo o código baseado no Microsoft linguagem intermediária (MSIL) é executado como código gerenciado.Un-Managed cupom:
Código que é criada sem ter em conta para o convenções e exigências da Common Language Runtime. não gerenciado executa o código no ambiente de tempo de execução linguagem comum com o mínimo serviços (por exemplo, nenhuma coleta de lixo, limitado a depuração, e assim por diante).
Referência: http: // www. dotnetspider.com/forum/11612-difference-between-managed-and-unmanaged-code.aspx
NUnit cargas os testes de unidade em um AppDomain separado, e presumo que o ponto de entrada não está sendo chamado (provavelmente não é necessário), daí a entrada montagem é nulo.
Dirigido código é o C # .Net, VB.Net, F # .NET etc compiladores criar. Ele é executado no CLR, que entre outros serviços oferece coisas como coleta de lixo e verificação de referência, e muito mais. Então, pense nisso como, meu código é gerenciado pelo CLR.
Por outro lado, não gerenciado compila o código diretamente para código de máquina. Ele não gerencia pelo CLR.
código é executado gerenciados dentro do ambiente de CLR ou seja .NET runtime.In curta toda IL são geridos code.But se você estiver usando uma terceira parte exemplo software VB6 ou componente VC ++ são código não gerenciado como .NET runtime (CLR) não tem controle sobre a execução de código fonte da língua.
código gerenciado: - Código que MSIL forma (linguagem intermediária) é desenvolvido após a compilação compilador de linguagem e executado diretamente pelo CLR
chamado código gerenciado.
por exemplo: - Todo o código 61 idioma suportado pelo .NET Framework
código não gerenciado: - código que desenvolveu antes .net
para o qual forma MSIL não está disponível e é executado por CLR
diretamente, em vez CLR
irá redirecionar para o sistema operacional isso é conhecido como código não gerenciado
por exemplo: -COM, Win32 APIs
- Dirigido Código:. Código escrito em linguagem .NET como C #, VB.NET
- não gerenciado Código: código não escrito em linguagem .NET e MSIL faz não entender o que é e não pode ser executado no CLR; como controles de terceiros que usamos em nossas aplicações .NET que não é criado em linguagens .NET.
Antes de mais nada entender isso, antes .NET framework
, Microsoft
foram fornecendo os produtos stand-alone como MFC (Visual C++), VB, FoxPro
etc.
Em 2002, a Microsoft combinou os seus produtos e fez framework .NET. Agora há uma diferença entre a forma como o código foi executado antes e como o código é gerido e executado em .NET framework. Microsoft introduziu conceito de CLR
com o .NET Framework que compila o código proveniente de qualquer lanugague suportada do framework .NET e fornecer funcionalidades adicionais como memory mangement, garbage collection
etc. Mas, tais características CLR não estavam disponíveis diretamente antes.
Então, se você está criando biblioteca / código em .NET framework (compilado com CLR), em seguida, que é chamado
Managed code
. Você pode usar esta biblioteca ainda mais em outro aplicativo .NET / projecto, e lá também, CLR entender como ele foi compilado antes, e é por isso que continua a ser o seu gerenciar o código.
OTOH se você quiser usar as bibliotecas que foram escritos antes de .NET framework, então você pode fazer com certas limitações, mas lembre-se, uma vez CLR não estava lá naquela época, então agora, CLR não vai entender e compilação este código novamente. E isto será chamado unmanaged code
. Por favor note que, bibliotecas / assembilies criados por alguns terceiros para fornecer certas características / ferramenta também pode ser considerado como código unmanage se não é CLR compatiblie.
Em termos leigos, Gestão código é algo que o CLR entende e pode compilá-lo por conta própria para posterior execução. Em .NET framework, (de quaisquer isso é linguagem trabalhar no framework .NET) Quando o código vai para o CLR, em seguida, a oferta de código algumas informações meta dados, de modo que CLR pode fornecer-lhe características especificadas aqui . Poucos deles são Garbage collection, Performance improvements, cross-language integration, memory management
etc.
OTOH, Código unmanged é algo específico para máquina e pronto para uso, sem necessidade de processá-lo ainda mais.
De Pro C # 5 e o .NET Framework 4.5:
Dirigido vs código não gerenciado: Talvez o ponto mais importante para entender sobre a linguagem C # é que ele pode produzir código que pode executar apenas dentro do .NET runtime (você nunca poderia usar C # para construir um servidor COM nativo ou um não gerido C / C ++ aplicação). Oficialmente falando, o termo usado para descrever o código visando o runtime .NET é o código gerenciado. A unidade de binário que contém o código gerenciado é chamado uma assembléia (mais detalhes sobre as assembléias em apenas um pouco). Por outro lado, um código que não podem ser diretamente oferecida pelo .NET runtime é denominado código não gerenciado.