Sei sulla pagina 1di 11

Assembly e Managed Module

A plataforma .NET tm o seu conjunto de conceitos, estruturas e tcnicas. Neste texto eu descrevo sobre dois destes conceitos: Assembly e Managed Module.

O texto descreve como estes dois conceitos so utilizados na plataforma .NET para armazenar e distribuir os componentes que compe os softwares e recursos necessrios aos mesmos.

Os exemplos de cdigo/projetos citados neste texto foram desenvolvidos e esto disponveis para as seguintes tecnologias/ferramentas:

- .NET Framework Version: v3.5 - C# Compiler Version : 3.5.21022.8 - C++/CLI Compiler Version : 15.00.21022.08 for 80x86 - ILAsm - ILDasm - Visual Studio 2008 Team System

Criando Managed Module

A partir do cdigo-fonte do seu aplicativo, as ferramentas de compilao e de gerao de arquivos, criam arquivos binrios como resultado destes processos. No Microsoft Windows, o formato de arquivo PE/COFF (Portable Executable and Common Object File Format), o padro utilizado para os arquivos do tipo EXE e DLL. Este formato utilizado nas verses 32-bit e 64-bit dos sistemas operacionais da Microsoft. Os compiladores para a plataforma .NET geram arquivos binrios no formato de arquivo PE/COFF.

Na realidade o formato PE/COFF uma verso modificada do formato de arquivo COFF (Common Object File Format) do Unix. O PE/COFF foi implementado a partir do Windows NT 3.1. Como o PE/COFF um formato amplamente reconhecido e utilizado, criar um novo formato de arquivo especfico para o .NET no era vivel e por isto a plataforma .NET o utiliza mas inclui informaes e estruturas que so reconhecidas pelo CLR (Common Language Runtime). Estas estruturas e informaes no alteram as estruturas do formato PE/COFF e sim so extenses. Portanto o arquivo ainda reconhecido pelo sistema operacional como um arquivo PE/COFF vlido.

Com estas informaes podemos agora descrever mais detalhadamente o conceito de ManagedModule.

Managed Module

Q: Como so organizados fisicamente os cdigos e recursos que utilizo em meus softwares para a plataforma .NET ?

A: Os programas escritos para o CLR Common Language Runtime residem em Managed Modules. Os cdigos compilados e os recursos que compe o software so armazenados em uma estrutura fsica (arquivo PE/COFF) descrita como Managed Module. Em um Managed Module possvel armazenar vrios tipos de informao alm do cdigo CIL (Common Intermediate Language) gerado pelo compilador.

Q: Mas o que um Managed Module afinal?

Um arquivo no formato PE/COFF (Portable Executable and Common Object File Format), cujo contedo pode ser executado pelo CLR Common Language Runtime.

Q: Sendo o Managed Module a forma como as informaes so gravadas em arquivo para que este seja executado, quais tipos de informao um Managed Module pode armazenar?

A: Um Managed Module pode ter em seu contedo:

Cdigo (CIL Common Intermediate Language e native code). Metadata Resources

Cdigo: O cdigo gerado pelos compiladores transformado em CIL (Common Intermediate Language) e armazenado no Managed Module. Um Managed Module tambm pode armazenar cdigo binrio nativo, ou seja, especfico para uma arquitetura de processador.

Metadata: Armazenam as descries dos tipos definidos no Managed Module incluindo: nomes, relacionamentos de herana, assinaturas de mtodos, informaes de dependncia, descries de estruturas internas e assim por diante.

Resources: Os resources contm dados estticos e somente para leitura como strings, arquivos de imagens e outros aspectos do programa que no so armazenados como cdigo executvel.

Para demonstrar como um Managed Module h uma soluo de exemplo, que faz parte deste texto, com a seguinte organizao:

Projetos nas linguagens C++/CLI e C# Solution Folder: AssembliesAndModules o Visual Studio Solution: AssembliesAndModules.sln Solution Folder: CPPCLI2008 Project: CPPCLI.OpenMind.Example01 Project: CSHARP.Test.Application

Solution Folder: CS2008 Project: CS.OpenMind.Example01

Os projetos CPPCLI.OpenMind.Example01 e CS.OpenMind.Example01 tm uma classe cada e estas tm dois mtodos simples que apenas exibem mensagens de texto. Eles servem apenas para ilustrar o cdigo CIL (Common Intermediate Language) gerado. Um item interessante o projeto CSHARP.Test.Application que est no solution folder CPPCLI2008. Se voc expandir a lista de referncias do projeto CSHARP.Test.Application, notar que existe uma referncia para o projeto em C+ +/CLI CPPCLI.OpenMind.Example01 e a classe Program.cs utiliza a classe gerada em C++/CLI. Este exemplo simples demonstra como a plataforma .NET bem projetada e poderosa.

Exemplo do contedo de um Managed Module

Os dois exemplos abaixo demonstram o CIL (Common Intermediate Language) gerado para os projetos de exemplo escritos nas linguagens C++/CLI e C#. Os projetos esto disponveis para download nos seguintes links:

Clique aqui para download da soluo com os projetos de exemplo.

Projeto CS.OpenMind.Example01

O cdigo abaixo o CIL (Common Intermediate Language) do Managed ModuleCS.OpenMind.Example01, escrito originalmente na linguagem C#.

No exemplo abaixo esto trechos do que gerado cada vez que um arquivo binrio para a plataforma .NET criado. No Managed Module h informaes estruturais e o cdigo que voc escreveu na linguagem C# compilado para CIL (Common Intermediate Language). Na linha em destaque (na cor amarela) voc l a diretiva .module CS.OpenMind.Example01.dll que indica o nome deste Managed Module. Voc tambm l neste trecho (na cor cinza) o nome do Assembly do qual o Managed Module faz parte. Este tipo de Assembly definido na plataforma .NET como singlemodule Assembly.

Trechos do cdigo em CIL (Common Intermediate Language) para o Managed Module CS.OpenMind.Example01.dll
// Metadata version: v2.0.50727 .assembly extern mscorlib { .publickeytoken = (B7 7A 5C 56 19 34 E0 89 ) .z\V.4.. .ver 2:0:0:0 } .assembly CS.OpenMind.Example01 { (OUTRAS INFORMAES DO MANAGED MODULE) } //

.module CS.OpenMind.Example01.dll // MVID: {D564A821-9F51-4EDD-9634-0E29BBA2FC4A} .imagebase 0x00400000 .file alignment 0x00001000 .stackreserve 0x00100000 .subsystem 0x0003 .corflags 0x00000001 // WINDOWS_CUI // ILONLY

// Image base: 0x00A90000

Projeto CPPCLI.OpenMind.Example01

O cdigo abaixo o CIL (Common Intermediate Language) do Managed ModuleCPPCLI.OpenMind.Example01, escrito originalmente na linguagem C+ +/CLI.

O que voc l no exemplo abaixo so trechos do que gerado cada vez que um arquivo binrio para a plataforma .NET criado. No Managed Module h informaes estruturais e o cdigo que voc escreveu na linguagem C++/CLI compilado para CIL (Common Intermediate Language). Na linha em destaque (na cor amarela) voc l a diretiva .module CPPCLI.OpenMind.Example01.dll que indica o nome deste Managed Module. Voc tambm l neste trecho (na cor cinza) o nome do Assembly do qual este Managed Module faz parte. Este tipo de Assembly definido na plataforma .NET como single-module Assembly.

Trechos do cdigo em CIL (Common Intermediate Language) para o Managed Module CPPCLI.OpenMind.Example01.dll
// Metadata version: v2.0.50727 .assembly extern mscorlib { .publickeytoken = (B7 7A 5C 56 19 34 E0 89 ) .z\V.4.. .hash = (EE 68 AE BC CF 3A 00 D9 99 47 67 8A CB B4 86 C1 .h...:...Gg..... 0B 52 25 4C ) .ver 2:0:0:0 } .assembly CPPCLI.OpenMind.Example01 { (OUTRAS INFORMAES DO MANAGED MODULE) } .module CPPCLI.OpenMind.Example01.dll // MVID: {4D59A8D0-7A89-4517-9D6B-A5DCA9851C22} .imagebase 0x10000000 .file alignment 0x00000200 .stackreserve 0x00100000 .subsystem 0x0002 .corflags 0x00000003 // WINDOWS_GUI // ILONLY 32BITREQUIRED // .R%L //

//

// Image base: 0x00950000

Com a definio e o exemplo de um Managed Module vamos conversar agora sobre como distribuir estes binrios da plataforma .NET.

Assembly

Um Assembly uma coleo de recursos que so construdos para funcionarem juntos. Deste modo proporcionam um conjunto coeso de funcionalidades. Colees de componentes .NET e outros arquivos so organizados para distribuio em Assemblies.

O propsito do Assembly criar um modelo de distribuio que permita ao CLR (Common Language Runtime), entre outras coisas, identificar quais so os recursos (como DLLs nativas, assemblies, arquivos de imagens, por exemplo) que compe a sua unidade de distribuio e, portanto so indispensveis para o correto funcionamento da aplicao. Um Assembly pode ser descrito como uma metafile. Ele existe conceitualmente e estruturalmente, mas no existe como um arquivo fsico (PE/COFF) e no deve ser confundido com um.

Quando o compilador gera um Managed Module e as informaes para o Assembly ao qual o Managed Module pertence, tambm so geradas as informaes de dependncia de outros Assemblies . Estas informaes de dependncia tambm so representadas na linguagem CIL (Common Intermediate Language).

Obtendo informaes: Metadados

A plataforma .NET tm uma API (Application Programming Interface) que nos permite, tanto via cdigo nativo ou usando uma das linguagens para plataforma .Net, como a C#, obter informaes sobre a estrutura interna de um Managed Module e/ou Assembly. Estas informaes so recuperadas dos Metadados. A API e o grupo de conceitos e tcnicas para ler estas informaes so chamados coletivamente de Reflection.

No projeto CSHARP.Test.Application existe um mtodo static chamado ShowInfoAboutModulesAndAssemblies que exibe as informaes sobre o Managed Module e os Assemblies.

Primeiro este mtodo obtm uma referncia para uma instncia da classe Module usando a classe Program.

Module module = typeof(Program).Module;

Em seguida ele utiliza a varivel module para exibir o nome do Managed Module em que a classe Program do CSHARP.Test.Application est definida. Voc vai observar que o cdigo utiliza a propriedade Name da classe Module para exibir esta informao.

Console.WriteLine("Module Name: {0}{1}", module.Name, Environment.NewLine );

A informao apresentada :

Module Name: CSHARP.Test.Applicaton.exe

Como voc pode observar, o nome do Managed Module o nome do arquivo PE/COFF.

Em seguida, para este mesmo Managed Module, exibida a informao sobre qual o AssemblyManaged Module est definido. Para isto eu utilizo a propriedade FullName da classe Assembly. em que este

Console.WriteLine("Assembly FullName {0} {1}:", module.Assembly.FullName.ToString(), Environment.NewLine );

A informao exibida a seguinte:

Assembly FullName:

CSHARP.Test.Application, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null.

Como voc pode notar no h nada nas informaes sobre o Assembly que indique que um arquivo fsico. Com isto fica mais claro o conceito de Assembly.

Para completar o exemplo, os Assemblies que so referenciados pelo CSHARP.Test.Application so listados utilizando o seguinte trecho de cdigo:

AssemblyName[] referencedAssemblies = module.Assembly.GetReferencedAssemblies();

foreach (AssemblyName assemblyName in referencedAssemblies) { Console.WriteLine( "Referenced Assembly FullName: {0} {1}", assemblyName.FullName, Environment.NewLine ); }

As informaes exibidas so:

Referenced Assembly FullName: mscorlib, Version=2.0.0.0, Culture=neutral, Public KeyToken=b77a5c561934e089 Referenced Assembly FullName: CPPCLI.OpenMind.Example01, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null

Mais uma vez podemos observar que o conceito de Assembly representa uma unidade de distribuio e funcionalidades associadas. Neste exemplo, para o AssemblyCSHARP.Test.Application e seu Managed Module CSHARP.Test.Application.exe realizarem as suas tarefas necessrio que os demais

Managed Modules e os respectivos Assemblies existam e estejam acessveis para a aplicao.

Os conceitos citados aqui esto disponveis na documentao da plataforma .NET no site: http://msdn.microsoft.com.

"Para todas as pessoas que nunca deixam de perguntar: Como isto funciona?"

Para a verso integral deste artigo no formato PDF e XPS v at este endereo: http://cid51f567d444ca91c7.skydrive.live.com/browse.aspx/Samples? view=details Nesta pasta existem 3 arquivos: - AssembliesAndModules.zip - CLR- Fundamentals - Assembly and Module.pdf - CLR- Fundamentals - Assembly and Module.xps Que so respectivamente: a soluo com os projetos de exemplo, a verso, no formato PDF, completa deste artigo e a verso, no formato XPS, completa deste artigo.

Potrebbero piacerti anche