O que exatamente é um assembly em C # ou .NET?

102

Você poderia explicar o que é um assembly em C # ou .NET?

  1. Onde começa e onde termina?
  2. Que informações importantes devo saber sobre Assembléias?
Roee Adler
fonte
5
Estritamente falando, um assembly não é um conceito .NET em vez de um conceito C #?
JeffH 01 de
14
@JeffH: quando fiz a pergunta, pensei que fosse um conceito C #. Agora eu entendo que é um .NET. No entanto, como eu acho que outras pessoas podem estar confusas como eu, intencionalmente não mudei para o Google para acomodar esse erro ...
Roee Adler

Respostas:

114

Um assembly é a saída compilada de seu código, normalmente uma DLL, mas seu EXE também é um assembly. É a menor unidade de implantação para qualquer projeto .NET.

O assembly normalmente contém código .NET em MSIL (Microsoft Intermediate language) que será compilado para código nativo ("JITted" - compilado pelo compilador Just-In-Time) na primeira vez em que for executado em uma determinada máquina. Esse código compilado também será armazenado no assembly e reutilizado em chamadas subsequentes.

O assembly também pode conter recursos como ícones, bitmaps, tabelas de string e assim por diante. Além disso, o assembly também contém metadados no manifesto do assembly - informações como número de versão, nome forte, cultura, assemblies referenciados e assim por diante.

Em 99% dos seus casos, uma montagem é igual a um arquivo físico no disco - o caso de uma montagem de vários arquivos (uma montagem, distribuída em mais de um único arquivo) parece ser um caso de borda bastante estranho que eu nunca encontrei até agora em meus mais de 5 anos de desenvolvimento .NET.

Em um assembly de vários arquivos, ainda haveria apenas um manifesto do assembly em uma DLL ou EXE e o código MSIL em vários arquivos netmodule.

marc_s
fonte
1
@marc_s: Eu acho que você quer dizer um arquivo multi-assembly. É possível empacotar vários assemblies em um único arquivo por meio das ferramentas de linha de comando do Studio, mas não diretamente por meio do IDE.
Greg D
5
Uma coisa muito importante em um assembly são os metadados no manifesto do assembly. O manifesto tem informações como versão, nome forte, cultura, assemblies referenciados, etc. Em um assembly de vários arquivos, ainda haveria apenas um manifesto do assembly em uma dll ou exe e o código MSIL em vários arquivos .netmodule. Basicamente, uma montagem é a unidade mínima de implantação em> net
softveda 01/09/09
@marc_s: Eu agradeceria se você acrescentasse o ponto de @ Pratik à resposta, obrigado
Roee Adler
@rax: concluído; @pratik: agora você está me confundindo: você fala sobre "montagem de vários arquivos" novamente, enquanto @GregD mencionou que realmente era um "arquivo de várias montagens" - o que é agora ?? (como eu disse - nunca encontrei tal besta, então não estou certo se são vários assemblies por arquivo ou vários arquivos por assembly ....)
marc_s
3
"Esse código compilado também será armazenado no assembly e reutilizado em chamadas subsequentes." Isso é enganoso e / ou não muito claro. Nenhum código compilado é "armazenado" em um assembly. Acho que você pode estar se referindo à maneira como cada método / função é "adaptado" ao código nativo quando é chamado pela primeira vez. Então, enquanto o assembly está na memória, a versão do código nativo do método é chamada. Se a montagem for descarregada e, posteriormente, recarregada, o processo de jit ocorrerá novamente. É claro que isso pressupõe que você não está usando NGEN para pré-compilar seus assemblies para código nativo (não recomendado).
Cinza,
13

Conjunto .NET

Na estrutura do Microsoft .NET, um assembly é uma biblioteca de código parcialmente compilada para uso em implantação, controle de versão e segurança.


fonte
7

http://www.codeguru.com/columns/csharp_learning/article.php/c5845

Um assembly é um arquivo gerado automaticamente pelo compilador após a compilação bem-sucedida de cada aplicativo .NET. Pode ser uma biblioteca de vínculo dinâmico ou um arquivo executável. Ele é gerado apenas uma vez para um aplicativo e a cada compilação subsequente, o assembly é atualizado.

Raghav
fonte
2
Os assemblies são diferentes dos arquivos que os contêm.
Greg D
1
@Raghav - Atualize sua fotografia com algo casual pelo amor de Deus! Não estamos posando aqui para passaportes, você sabe!
TheFlash
3

Aqui está outra explicação sobre a composição dos .NET Assemblies, uma minicitação:

A estrutura .NET consiste nos conceitos de módulos, assemblies, que armazenam metadados e informações de manifesto. Uma montagem pode conter vários módulos. O Visual C # cria apenas um módulo que é transformado em assembly pelo compilador C # (csc.exe), mas um assembly pode vincular muitos módulos .NET por meio da ferramenta de linha de comando do linker de assembly (al.exe). Por exemplo, cada um dos arquivos .cs do código-fonte pode ser compilado em um módulo e vinculado para formar um assembly - um assembly é apenas uma coleção de módulos e recursos. Um desses módulos, no entanto; deve conter informações de metadados de manifesto (veja abaixo) para que o assembly seja entendido pelo CLR.
....
Tendo criado um novo .exe ou .dll dentro do VS.NET, você verá o seu arquivo aparecer dentro da pasta bin. Abri-lo no bloco de notas gerará confusão, ou mesmo dentro de um editor hexadecimal sem saber a estrutura do arquivo, você precisa de uma ferramenta como ildasm.exe ou CFF explorer para extrair significado dele. A estrutura da montagem é a seguinte:

PE cabeçalho
CLR cabeçalho
CLR metadados
CLR
código IL
dados Native

Chris S
fonte
Para onde diabos esse link está me levando? Uma espécie de redirecionamentos infinitos! Depois de alguns redirecionamentos, fui para uma página que diz isso . Também não há como obter o URL original que você postou.
Sнаđошƒаӽ
2

A resposta é adequada para uma compreensão imediata.

Simplificando, é o projeto compilado envolvendo suas classes e arquivos adicionais, se houver. Ou seja, cada projeto em uma solução é montagem .

Ou mais tecnicamente,

Um assembly é onde um tipo é armazenado no sistema de arquivos. Assemblies são um mecanismo de implantação de código. Por exemplo, a System.Data.dll montagem contém tipos de gerenciamento de dados. Para usar tipos em outros assemblies, eles devem ser referenciados. - Fonte

Como sabemos disso? Se você olhar as propriedades de um projeto na solução, poderá ver as seguintes imagens.

Quando você compila o projeto, ele se transforma em DLL ou EXE .

insira a descrição da imagem aqui insira a descrição da imagem aqui insira a descrição da imagem aqui

snr
fonte
1

Quando um código-fonte é compilado pelo compilador de linguagem, ele gera um Managed Assembly e MSIL (MisroSoft Intermediate Language). Esse assembly contém um arquivo .dll ou .exe . Um Assebmly pode ser de dois tipos Private Assembly e Shared Assembly . O Assembly compartilhado é armazenado no GAC (Global Assembly Cache) para que qualquer aplicativo possa se referir a ele enquanto o assembly privado é armazenado na pasta do aplicativo que pode ser usado por apenas um aplicativo.

gaurav patni
fonte
0

Um assembly é uma DLL ou EXE que será criado quando você publicá-lo ou compilar seu aplicativo.

Anup Shetty
fonte
0

Uma montagem é uma coleção de unidades lógicas. As unidades lógicas referem-se aos tipos e recursos que são necessários para construir um aplicativo e implantá-los usando a estrutura .Net. Basicamente, o Assembly é uma coleção de Exe e DLLs. É portátil e executável.

Abhay.Patil
fonte
-1

Após escrever o código-fonte do seu programa (projeto), é criado um arquivo que pode ser DLL ou EXE dependendo do seu projeto. Faz apenas uma vez para um único projeto. Tem dois tipos 1: - único 2: - conjunto único compartilhado ou multiprograma usado apenas em um único programa, enquanto compartilhado pode ser usado para multiprograma

kirti kant pareek
fonte
Depois de escrever o código-fonte do seu programa (projeto), é criado um arquivo que pode ser DLL ou EXE dependendo do seu projeto - depois de escrever o código-fonte? Não parece ser uma indicação muito boa de quando o arquivo foi criado, o que, aliás, é irrelevante, dada a questão.
Sнаđошƒаӽ