Assemblies no .NET

Os assemblies são as unidades fundamentais de implantação, controle de versão, reutilização, definição de escopo de ativação e permissões de segurança para aplicativos baseados em .NET. Um assembly é uma coleção de tipos e recursos compilados para funcionar juntos e formar uma unidade lógica de funcionalidade. Os assemblies assumem a forma de arquivos executáveis (.exe) ou de biblioteca de link dinâmico (.dll) e são os blocos de construção dos aplicativos .NET. Eles oferecem ao Common Language Runtime as informações de que ele precisa para estar ciente das implementações de tipo.

No .NET e no .NET Framework, é possível criar um assembly com base em um ou mais arquivos de código-fonte. No .NET Framework, os assemblies podem conter um ou mais módulos. Isso permite que projetos maiores sejam planejados para que diversos desenvolvedores possam trabalhar em módulos ou arquivos de código-fonte separados, que são posteriormente combinados para criar um único assembly. Para saber mais sobre módulos, confira Como criar um assembly de diversos arquivos.

Os assemblies têm as seguintes propriedades:

  • Os assemblies são implementados como arquivos .exe ou .dll.

  • Para bibliotecas direcionadas ao .NET Framework, é possível compartilhar assemblies entre aplicativos colocando-os no GAC (cache de assembly global). É necessário dar nomes fortes aos assemblies antes de incluí-los no GAC. Para saber mais, confira Assemblies de nome forte.

  • Os assemblies serão carregados na memória somente se forem necessários. Se não forem usados, eles não serão carregados. Isso significa que os assemblies podem ser uma maneira eficiente de gerenciar recursos em projetos grandes.

  • Você pode obter informações programaticamente sobre um assembly usando reflexão. Para obter mais informações, confira Reflexão (C#) ou Reflexão (Visual Basic).

  • É possível carregar um assembly para uma inspeção simples usando a classe MetadataLoadContext no .NET e no .NET Framework. MetadataLoadContext substitui os métodos Assembly.ReflectionOnlyLoad.

Assemblies no Common Language Runtime

Os assemblies fornecem ao Common Language Runtime as informações necessárias para reconhecer as implementações de tipo. Para o runtime, um tipo não existe fora do contexto de um assembly.

Um assembly define as seguintes informações:

  • O código que o Common Language Runtime executa. Observe que cada assembly pode ter somente um ponto de entrada: DllMain, WinMain ou Main.

  • Limite de segurança. Um assembly é a unidade na qual as permissões são solicitadas e concedidas. Para saber mais sobre limites de segurança em assemblies, confira Considerações de segurança de assembly.

  • Limite de tipo. A identidade de cada tipo inclui o nome do assembly no qual ele reside. Um tipo chamado MyType, carregado no escopo de um assembly, não é o mesmo de um tipo chamado MyType, carregado no escopo de outro assembly.

  • Limite do escopo de referência. O manifesto do assembly tem metadados que são usados para resolver tipos e atender a solicitações de recursos. O manifesto especifica os tipos e recursos a serem expostos fora do assembly e enumera outros assemblies dos quais ele depende. O código MSIL (linguagem intermediária da Microsoft) em um arquivo PE (executável portátil) não será executado a menos que tenha um manifesto de assembly associado.

  • Limite de versão. O assembly é a menor unidade de versão no Common Language Runtime. Todos os tipos e recursos no mesmo assembly são versionados como uma unidade. O manifesto do assembly descreve as dependências de versão especificadas para quaisquer assemblies dependentes. Para saber mais sobre o controle de versão, confira Controle de versão de assembly.

  • Unidade de implantação. Quando um aplicativo é iniciado, somente os assemblies que o aplicativo chama inicialmente devem estar presentes. Outros assemblies, como os que contêm recursos de localização ou classes de utilitários, podem ser recuperados sob demanda. Isso permite que os aplicativos sejam simples e leves quando baixados pela primeira vez. Para saber mais sobre a implantação de assemblies, confira Implantar aplicativos.

  • Unidade de execução lado a lado. Para saber mais sobre a execução de diversas versões de um assembly, confira Assemblies e execução lado a lado.

Criar um assembly

Assemblies podem ser estáticos ou dinâmicos. Assemblies estáticos são armazenados em disco em arquivos PE. Os assemblies estáticos podem incluir interfaces, classes e recursos como bitmaps, arquivos JPEG e outros arquivos de recursos. Também é possível criar assemblies dinâmicos, que são executados diretamente da memória e não são salvos em disco antes da execução. Você pode salvar assemblies dinâmicos em disco após sua execução.

Existem várias maneiras de criar assemblies. É possível usar ferramentas de desenvolvimento, como o Visual Studio, para criar arquivos .dll ou .exe. É possível usar as ferramentas no SDK do Windows para criar assemblies com módulos de outros ambientes de desenvolvimento. Você também pode usar APIs do Common Language Runtime, como System.Reflection.Emit, a fim de criar assemblies dinâmicos.

Compile assemblies criando-os no Visual Studio, criando-os com ferramentas de interface de linha de comando do .NET Core ou compilando os assemblies do .NET Framework com um compilador de linha de comando. Para saber como criar assemblies usando a CLI do .NET, confira Visão geral da CLI do .NET.

Observação

Para compilar um assembly no Visual Studio, no menu Compilar, selecione Compilar.

Manifesto do assembly

Cada assembly tem um arquivo de manifesto de assembly. Semelhante a um índice, o manifesto do assembly contém o seguinte:

  • A identidade do assembly (seu nome e versão).

  • Uma tabela que descreve todos os outros arquivos que compõem o assembly, como outros assemblies que você criou e dos quais o arquivo .exe ou .dll depende, arquivos bitmap ou arquivos leia-me.

  • Uma lista de referências de assembly, que é uma lista de todas as dependências externas, como .dlls ou outros arquivos. As referências de assembly contêm referências a objetos globais e privados. Os objetos globais estão disponíveis para todos os outros aplicativos. No .NET Core, os objetos globais são acoplados a um determinado runtime do .NET Core. No .NET Framework, os objetos globais residem no GAC (cache de assembly global). System.IO.dll é um exemplo de um assembly no GAC. Os objetos privados devem estar em um nível de diretório igual ou inferior ao diretório em que seu aplicativo está instalado.

Como os assemblies contêm informações sobre conteúdo, controle de versão e dependências, os aplicativos que os usam não precisam depender de fontes externas, como o registro em sistemas Windows, para funcionar corretamente. Os assemblies reduzem os conflitos de .dll e tornam seus aplicativos mais confiáveis e fáceis de implantar. Em muitos casos, você pode instalar um aplicativo baseado em .NET simplesmente copiando seus arquivos para o computador de destino. Para saber mais, confira Manifesto de assembly.

Adicionar uma referência a um assembly

Para usar um assembly em um aplicativo, é necessário adicionar uma referência a ele. Depois que um assembly é referenciado, todos os tipos, propriedades, métodos e outros membros acessíveis de namespaces dele ficam disponíveis para o aplicativo como se o código deles fizesse parte do arquivo de origem.

Observação

A maioria dos assemblies da Biblioteca de Classes .NET é referenciada automaticamente. Se um assembly do sistema não for referenciado automaticamente, adicione uma referência de uma das seguintes maneiras:

  • Para o .NET e o .NET Core, adicione uma referência ao pacote NuGet que contém o assembly. Use o gerenciador de pacotes NuGet no Visual Studio ou adicione um elemento <PackageReference> para o assembly ao projeto .csproj ou .vbproj.
  • Para o .NET Framework, adicione uma referência ao assembly usando a caixa de diálogo Adicionar referência no Visual Studio ou usando a opção de linha de comando -reference para os compiladores C# ou Visual Basic.

Em C#, é possível usar duas versões do mesmo assembly em um único aplicativo. Para obter mais informações, consulte alias externo.

Título Descrição
Conteúdos do assembly Elementos que compõem um assembly.
Manifesto do assembly Dados no manifesto do assembly e como eles são armazenados nos assemblies.
Cache de assembly global Como o GAC armazena e usa assemblies.
Assemblies de nome forte Características de assemblies de nome forte.
Considerações sobre a segurança do assembly Como a segurança funciona com assemblies.
Controle de versão do assembly Visão geral da política de controle de versão do .NET Framework.
Posicionamento do assembly Onde localizar assemblies.
Assemblies e execução lado a lado Use diversas versões do runtime ou um assembly simultaneamente.
Emissão de métodos e assemblies dinâmicos Como criar assemblies dinâmicos.
Como o runtime localiza assemblies Como o .NET Framework resolve referências de assembly no runtime.

Referência

System.Reflection.Assembly

Confira também