Pergunta

Escrevo código C/C++ há quase vinte anos e conheço Perl, Python, PHP e um pouco de Java também, e estou aprendendo JavaScript sozinho.Mas nunca fiz nada em .NET, VB ou C#.O que exatamente faz gerenciou código significa?

Wikipédia descreve isso simplesmente como

Código que é executado sob o gerenciamento de uma máquina virtual

e diz especificamente que Java é (geralmente) código gerenciado, então

  • por que o termo parece se aplicar apenas a C#/.NET?
  • Você pode compilar C # em um .exe que também contenha a VM ou precisa empacotá-lo e entregá-lo a outro .exe (a la java)?

Na mesma linha,

  • é .NET um linguagem ou um estrutura, e o que exatamente significa "estrutura" aqui?

OK, isso é mais do que uma pergunta, mas para alguém que está na indústria há tanto tempo quanto eu, estou me sentindo um pouco N00B agora...

Foi útil?

Solução

Quando você compila o código C# em um .exe, ele é compilado no bytecode Common Intermediate Language (CIL).Sempre que você executa um executável CIL, ele é executado na máquina virtual Common Language Runtime (CLR) da Microsoft.Portanto, não, não é possível incluir a VM no seu arquivo executável .NET.Você deve ter o tempo de execução .NET instalado em todas as máquinas clientes onde seu programa será executado.

Para responder à sua segunda pergunta, o .NET é um framework, pois é um conjunto de bibliotecas, compiladores e VM que não é específico de uma linguagem.Assim, você pode codificar no .NET framework em C#, VB, C++ e qualquer outra linguagem que possua um compilador .NET.

https://bitbucket.org/brianritchie/wiki/wiki/.NET%20Languages

A página acima contém uma lista de idiomas que possuem versões .NET, bem como links para suas páginas.

Outras dicas

Principalmente, refere-se ao fato de que todas as suas alocações de memória são "gerenciadas" para você.Se você estiver usando código gerenciado, não precisará se preocupar em liberar seus objetos quando terminar de usá-los.Simplesmente permitir que eles saiam do escopo significará que a VM eventualmente reconhecerá que não há mais referências a eles e o Garbage os coletará, devolvendo a memória ao sistema.

O código não gerenciado, por outro lado, simplesmente "vazará", a menos que você libere explicitamente seus ponteiros antes de descartar as referências.

Não acho que você esteja sozinho confuso sobre o que é .Net.Já existem outras respostas que deveriam ajudar você, mas vou lançar esta informação para outras pessoas.

Para ver o que .Net "realmente" é, basta acessar c:\Windows\Microsoft.Net\Framework

Lá você verá pastas específicas para as versões que você instalou.Vá para a pasta v2.0.xxxxx se você a tiver instalada, por exemplo.

Nessa pasta está a estrutura.Você basicamente verá vários arquivos .exe e .dll.Todos os arquivos DLL que começam com System.*.dll são essencialmente a estrutura .Net.

Os arquivos .exe que você verá nessa pasta são utilitários para desenvolvedores e também para compiladores.Você mencionou C#.Encontre o arquivo csc.exe.Esse é o seu compilador C#.

Construir um programa é muito simples.Jogue o código a seguir em um arquivo hello.cs.

using System;
class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("hello world");
        }
    }

Em seguida, na linha de comando digite> csc hello.cs

Isso irá gerar um arquivo .exe.Execute-o e ele irá cuspir 'olá mundo', obviamente.

A linha que diz Console.WriteLine() está chamando o Framework.Console é um objeto que reside no namespace System e WriteLine() é um método estático.

Este é o código desmontado para esse método Console.WriteLine():

[HostProtection(SecurityAction.LinkDemand, UI=true)]
public static void WriteLine(string value)
{
    Out.WriteLine(value);
}

Quando as pessoas dizem coisas como “Devo usar PHP ou .Net?” ou “Devo usar Python ou .Net”, você começa a ver como essa é a coisa errada a se discutir.Obviamente, eles estão comparando uma linguagem a um Framework.C # é uma linguagem e apenas uma das muitas linguagens que podem ser usadas para escrever código na plataforma .Net.Esse mesmo método de Console.WriteLine() pode ser invocado de C#, VB.Net, Pascal, C++, Ruby, Python, F# e qualquer outra linguagem que tenha sido feita para funcionar na plataforma .Net.

Espero que isso ajude.

-Keith

É usado principalmente para descrever o .NET porque esse foi o termo que a Microsoft escolheu para diferenciar o .NET do C/C++ e de outras linguagens mais antigas.A Microsoft escolheu-o porque não era um termo normalmente associado a Java porque não queria enfatizar as semelhanças entre C#/.NET e Java (em vez de chamá-lo de algo como 'código de máquina virtual', o que tornaria soa muito mais parecido com Java).Basicamente, o uso de "código gerenciado" é uma terminologia orientada pelo marketing, e não pela técnica.

Especificamente em .NET e Visual C++, você pode ter código não gerenciado e gerenciado.Os termos referem-se à maneira pela qual a memória é alocada e “gerenciada”.

Código não gerenciado seria o material C++ com o qual você está acostumado.Alocação dinâmica de memória e liberação explícita de memória.O tempo de execução do .NET não gerencia a memória para você, portanto, 'não gerenciado'.

O código gerenciado, por outro lado, é gerenciado pelo tempo de execução.Você aloca memória onde necessário (declarando variáveis, não espaço de memória) e o coletor de lixo em tempo de execução determina quando ela não é mais necessária e limpa tudo.O coletor de lixo também moverá a memória para melhorar a eficiência.O tempo de execução 'gerencia' tudo para você.

Como mencionei acima, é possível escrever código gerenciado e não gerenciado.

Não gerenciado:

class Bar : public Foo {
    private:
            int fubar;
    public:
            Bar(int i) : fubar(i) {}
            int * getFubar() { return * fubar; }
}

Gerenciou:

public ref class Bar :  public Foo
    private:
            int fubar;
    public:
            Bar(int i) : fubar(i) {}
            int ^ getFubar() { return ^ fubar; }
}

Observe o árbitro?Isso praticamente designa uma classe gerenciada.No entanto, fica muito confuso quando você mistura os dois tipos de código.Por exemplo, você deseja salvar um ponteiro de referência, (^) o equivalente gerenciado de um ponteiro, em um controle Picture Box dentro de sua classe não gerenciada.Como o coletor de lixo pode movimentar a memória, na próxima vez que você tentar desreferenciar a caixa de imagem, ela não será encontrada.O tempo de execução não informa ao código não gerenciado sobre as alterações de memória.

Portanto, você precisa fixar o objeto gerenciado na memória para permitir que seu código não gerenciado o acompanhe.Depois, há o unboxing e todos os tipos de outras peculiaridades que permitem misturar os dois.A complexidade do código é enorme!

Oficialmente, gerenciado/não gerenciado pode se resumir à forma como o código é executado na pilha .NET.No entanto, se você tem experiência em C++, espero que isso seja um pouco mais relevante para você.

Gerenciado significa que o código não é compilado em código nativo e, portanto, é executado sob os auspícios de uma máquina virtual.Java compila em um formato intermediário chamado bytecode, que o Java VM sabe como interpretar e executar.Todas as linguagens .NET fazem algo semelhante, compilando para IL (linguagem intermediária) que o tempo de execução do .NET interpreta.É um pouco confuso porque o .NET IL tem terminações de arquivo .dll e .exe.

O termo gerenciou geralmente é aplicado apenas ao .NET porque a Microsoft usa o termo.A Microsoft geralmente não usa o termo “máquina virtual” em referência a um ambiente de execução gerenciado .NET.

O "bytecode" (IL) do .NET é um pouco diferente do bytecode Java porque foi explicitamente projetado para ser compilado em código nativo antes da execução no ambiente gerenciado, enquanto Java foi projetado para ser interpretado, mas o conceito de código independente de plataforma É similar.

O “.NET Framework” é basicamente um enorme conjunto de bibliotecas fornecidas pela Microsoft, contendo milhares de classes que podem ser utilizadas para desenvolver aplicações.

Um .exe C# compilado contém código independente de plataforma que pode ser executado em qualquer ambiente compatível com .NET, incluindo Mono.No entanto, o tempo de execução geralmente é distribuído separadamente dos aplicativos que o utilizam.

Correndo o risco de ofender alguns, suspeito que a palavra gerenciado foi usada para que pudessem usar a palavra não gerenciado em vez de compilado.Embora gerenciado possa significar mais, a realidade é que parece ser usado para distinguir principalmente entre o que é praticamente uma compilação just in time (como o substituto do que já foi interpretado ou pcode) e o código compilado nativo.

Ou dito de outra forma, qual você prefere usar:

a) Código não gerenciado que pode fazer coisas incontroláveis ​​ao sistema.

b) Código compilado nativo que é rápido, sólido e próximo ao sistema operacional.

Claro, eles são na verdade a mesma coisa.

Na mesma linha, o .NET é uma linguagem ou uma estrutura, e o que exatamente significa “estrutura” aqui?<<

.NET é a atual plataforma de software empresarial da Microsoft.Isso consiste de:

• Uma interface universal única para acessar funcionalidades do Windows:

o The .NET Framework Class Library (FCL).
o The FCL provides a rich set of high-level functionality for developers.

• Uma única linguagem universal e tempo de execução para execução de aplicativos .NET:

o Common Language Runtime (CLR) executes Common Intermediate Language (CIL).
o The CLR is God: it runs, controls, and polices everything.

• A escolha de múltiplas linguagens para desenvolvimento de aplicações .NET:

o Every development language is compiled to CIL, which is run by the CLR.
o C# and VB are the two main development languages.

.NET é uma estrutura.O Common Language Runtime (CLR) executa o código Microsoft Intermediate Language (MSIL) gerado quando uma solução é compilada (ou seja, não é compilada em código de máquina).Você não pode conter a API dentro do exe, nem gostaria, pois ela é muito grande.O principal benefício aqui é o gerenciamento de memória (entre algumas outras vantagens de segurança e possivelmente outras que eu não conheço).

Posso responder à questão da estrutura..NET é uma estrutura, C#, VB.NET, etc são linguagens.Basicamente, o .NET fornece uma plataforma comum de bibliotecas para chamar (All the System....dlls) que qualquer linguagem que use .NET pode chamar.Todas as linguagens .NET são compiladas em MSIL (Microsoft Intermediate Language, mais conhecido apenas como IL), que pode então ser executado em qualquer PC com o framework .NET apropriado instalado.

.NET é uma estrutura.Ele pode ser usado em várias linguagens (VB.NET, C#, IronPython, boo, etc)

O .NET sempre é executado conforme interpretado e não, você não pode incluir a 'VM' dentro do .exe.Qualquer usuário que deseje executar seu aplicativo .NET deve ter a estrutura instalada.

Pode se referir a qualquer código executado por uma máquina virtual, e não diretamente pela CPU.

Acho que isso permite coisas como coleta de lixo e verificação de limites de array.

Pessoalmente, acho que a palavra “estrutura” é um pouco imprópria.

.NET é uma “plataforma”, composta por um ambiente de execução (a máquina virtual CLR) e um conjunto de bibliotecas.É exatamente análogo a Java, Perl ou Python (nenhum dos quais é chamado de "frameworks").

Na maioria dos casos, a palavra "framework" é usada para projetos como Spring, Struts ou QT, que ficam no topo de uma plataforma (ou seja, não fornecem nenhum ambiente de execução próprio), como uma biblioteca.

Mas, diferentemente de uma “biblioteca”, uma estrutura procura redefinir as operações fundamentais da plataforma subjacente.(A injeção de dependência do Spring desafia a lógica de chamada de construtor do código Java comum.A implementação de sinais e slots do QT desafia o código C++ comum.)

Eu sei que estou sendo apenas um bastardo pedante, mas para mim, .NET não é um framework.É uma plataforma.

Código gerenciado - MSIL e IL e código gerenciado são iguais. Quando construímos nosso aplicativo, os arquivos .dll ou .exe são gerados na pasta Bin. Esses arquivos são chamados de código gerenciado. Posteriormente, esses arquivos são fornecidos ao CLR para gerar nativo código que seria compreendido pelo sistema operacional.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top