VB .NET - Obtendo os assemblies do GAC - Global Assembly Cache


Você já deve ter ouvido ou lido algumas vezes a palavra assembly na documentação.NET.

Então você já deve saber o que é um assembly ou assemblies no plural ?

No ambiente da plataforma .NET o assembly é a unidade de distribuição para programas e livrarias de classes. Um Assembly é apenas um arquivo com a extensão .exe, para programas executáveis, ou  com a extensão .dll, para livraria de classes que residem em uma DLL - Dinamic Link Library.

Um assembly consiste de um ou mais módulos (arquivos como um programa executável ou dll requerem). Cada módulo em um assembly possui um correspondente arquivo manisfest que fornece os metadados (informação sobre o módulo). O próprio assembly trata o manifest master que descreve cada módulo que o assembly contém bem como os atributos específicos do assembly.

No assembly, o código reside no formato de uma linguagem intermediária (IL);  antes que o código do assembly seja executado, um compilador just-in-time (JIT) no sistema de origem compila o código IL em um código nativo.

Assemblies podem ser privativos para uma aplicação ou compartilhados entre múltiplas aplicações.  Um assembly privativo de uma aplicação esta localizado no subdiretório da aplicação. Já um assembly compartilhado esta localizado no Global Assembly Cache - GAC (em geral na pasta c:\Windows\Assembly). Para colocar um assembly no GAC, você pode usar o utilitário de linha de comando GACUTIL.

Um assembly compartilhado difere de um privado pois o assembly compartilhado possui uma chave pública que identifica de forma única o assembly ( um nome forte ou strong name).

O GAC - Global Assembly Cache é um local em seu disco rígido onde o Windows armazena os assemblies (.dll/ou .exe) que podem ser usados por muitas aplicações. Na verdade, todas as .dlls Usadas na plataforma .NET são armazenadas no GAC e referenciadas quando adicionadas a um projeto (Ex: imports System.IO).

A localização típica desses arquivos é na pasta "C:\WINDOWS\ assembly" Você pode navegar para estas pasta via Explorer, porém você não pode obter uma lista desses assemblies simplesmente usando o as operações padrões para arquivos e diretórios

A plataforma .NET inclui um utilitário chamado gacutil.exe que pode ser usado para tratar com os assemblies do GAC. Sua localização pode variar dependendo da versão da plataforma .NET instalada mas geralmente ele esta localizado em: C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\bin

Neste artigo eu vou mostrar como usar este utilitário e os recursos da plataforma .NET disponíveis nos namespaces System.Diagnostics e System.Reflection para exibir os assemblies do GAC em uma aplicação Windows Forms usando a linguagem VB .NET.

Criando o projeto no VB .NET

Abra o Visual Basic 2010 Express Edition e no menu File clique em New Project e selecione o template Windows Forms Application informando o nome ListaAssembliesGAC;

No formulário form1.vb vamos incluir um controle um controle GroupBox e no seu interior um controle ListView e definir as seguintes propriedades do controle ListView:

1- Dock = fill

2 - Columns - Defina duas colunas conforme mostra a figura abaixo:

3- GridLines - True

4- View - Details

O leaiute do formulário deverá ficar conforme a figura abaixo:

No início do formulário vamos incluir as declarações dos namespaces :

Imports System.IO
Imports System.Reflection
Imports System.Diagnostics

No evento Load do formulário form1.vb inclua o código abaixo:

 Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
   
    ' caminho do aplicativo gacutil.exe na minha maquina local
        Dim utilPath = "C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\bin\gacutil.exe"

        Dim gacUtilProcess As New Process()
        With gacUtilProcess.StartInfo
         
  ' Path do utilitário
            .FileName = utilPath
        
   ' A saida será obtida em um objeto StreamReader
            .RedirectStandardOutput = True
            .UseShellExecute = False
            '
Não vamos mostrar a janela do utilitário quando ele iniciar
            .CreateNoWindow = True
         
  ' /l (caixa baixa "L") apenas diz ao utilitário para listar os assemblies
            .Arguments = "/l"
        End With

       
' inicia o utilitário gacutil.exe 
        gacUtilProcess.Start()
     
  ' redireciona a a saida do gacutil.exe output para o StreamReader  
        Dim gacSaida As StreamReader = gacUtilProcess.StandardOutput
        '
Le a saida do gacutil.exe linha-por-linha e adiciona no ListView 
        While Not gacSaida.EndOfStream

            Dim saida = gacSaida.ReadLine()
          
 ' Use o namespace System.Reflection.AssemblyName para ajudar no trabalho
            ' de parse da string de saida em valores desejados de Nome e Versão

            Try
                Dim asm As New AssemblyName(saida)
                If Not asm.Version = Nothing Then
                
   ' incluir no ListView 
                    Dim listViewItem As New ListViewItem(asm.Name)
                    listViewItem.SubItems.Add(asm.Version.ToString())
                    Me.lstvAssemblies.Items.Add(listViewItem)
                End If
            Catch ex As Exception

            End Try

        End While
     
  ' Libera o recurso StreamReader
        gacSaida.Close()
    End Sub

Este código realiza três tarefas básicas:

  1. Cria uma instância do System.Diagnostics.Process do utilitário "gacutil.exe"
  2. Captura a leitura da saída do "gacutil.exe"
  3. Atualiza a interface do usuário com o resultado

Executando projeto iremos obter o seguinte resultado:

Pegue o projeto completo aqui: ListaAssembliesGAC.zip

Mar 2:6 Ora, estavam ali sentados alguns dos escribas, que arrazoavam em seus corações, dizendo:

Mar 2:7 Por que fala assim este homem? Ele blasfema. Quem pode perdoar pecados senão um só, que é Deus?

Mar 2:8 Mas Jesus logo percebeu em seu espírito que eles assim arrazoavam dentro de si, e perguntou-lhes: Por que arrazoais desse modo em vossos corações?

Mar 2:9 Qual é mais fácil? dizer ao paralítico: Perdoados são os teus pecados; ou dizer: Levanta-te, toma o teu leito, e anda?

Mar 2:10 Ora, para que saibais que o Filho do homem tem sobre a terra autoridade para perdoar pecados ( disse ao paralítico ),

Mar 2:11 a ti te digo, levanta-te, toma o teu leito, e vai para tua casa.

Referências:


José Carlos Macoratti