VB .NET - Obtendo informações do Assembly


 No artigo de hoje vou mostrar como podemos obter informações do Assembly usando a linguagem VB .NET em um projeto Windows Forms.

A caixa de diálogo Informações do Assembly é usada para especificar os valores dos atributos do assembly .NET Framework, que são armazenados no arquivo AssemblyInfo criado automaticamente com o seu projeto.



No Solution Explorer, para projeto Visual Basic, o arquivo está localizado no nó My Project (clique no ícone Show All Files (mostrar todos os arquivos) para vê-lo);

As informações contidas no arquivo são:

Title Especifica um título para o manifesto do assembly. Corresponde à AssemblyTitleAttribute.
Description Especifica uma descrição opcional para o manifesto do assembly. Corresponde à AssemblyDescriptionAttribute.
Company Especifica o nome da empresa para o manifesto do assembly. Corresponde à AssemblyCompanyAttribute.
Product Especifica um nome do produto para o manifesto do assembly. Corresponde à AssemblyProductAttribute.
Copyright Especifica um aviso de copyright para o manifesto do assembly. Corresponde à AssemblyCopyrightAttribute
Trademark Especifica uma marca registrada para o manifesto do assembly. Corresponde à AssemblyTrademarkAttribute.
Assembly Version Especifica um número de versão que instrui o compilador para usar uma versão específica para o recurso de versão de arquivo Win32. Corresponde à AssemblyFileVersionAttribute.
GUID Um GUID exclusivo que identifica o conjunto. Quando você cria um projeto, Visual Studio gera um GUID para o assembly. Corresponde à Guid.
Neutral Language Especifica qual  a cultura o assembly suporta. Corresponde à NeutralResourcesLanguageAttribute. O padrão é (nenhum).
Make assembly COM-Visible Especifica se os tipos no Assesmbly estarão disponíveis para COM. Corresponde à ComVisibleAttribute

Usando os atributos do Assembly é possível especificar as meta informações do assembly, como o título do produto ou versão, quer automaticamente pelo Visual Studio ou manualmente editando o arquivo "AssemblyInfo.vb" em My Project.

Neste artigo vamos criar uma classe para ler os atributos a partir de qualquer assembly. Para obter informação de um conjunto de AssemblyInfo o construtor pode ser usado, passando o conjunto específico. Se o atributo assembly correspondente a uma propriedade não for encontrado, será retornado nothing.

Recursos usados :

Criando o projeto no VS 2013 Express Edition

Abra o VS 2013 Express for Windows desktop e clique em New Project;

A seguir selecione Visual Basic -> Windows Forms Application;

Informe o nome Assembly_Info_vbn e clique no botão OK;

No formulário form1.vb vamos incluir os seguintes controles a partir da ToolBox:

Disponha os controles no formulário conforme o leiaute da figura abaixo:

Criando a classe para obter informações do Assembly

Podemos obter as informações do Assembly diretamente sem carregar o assembly usando o código abaixo:

AssemblyName.GetAssemblyName("nome_do_arquivo.exe").Version

ou ainda

Dim _assembly As AssemblyName = AssemblyName.GetAssemblyName("c:\winnt\microsoft.net\framework\v1.0.3705\mscorlib.dll")
Console.WriteLine(_assembly.Version.ToString())

Podemos também usar o código a seguir :

        Dim aAssembly As Assembly = Assembly.GetExecutingAssembly

        Dim Descricao As AssemblyDescriptionAttribute = _
            AssemblyDescriptionAttribute.GetCustomAttribute( _
            aAssembly, GetType(AssemblyDescriptionAttribute))

        Dim Titulo As AssemblyTitleAttribute = _
            AssemblyTitleAttribute.GetCustomAttribute( _
            aAssembly, GetType(AssemblyTitleAttribute))

        MessageBox.Show("Titulo : " & Titulo.Title & " Descrição " & Descricao.Description)

 

Ou podemos criar uma classe para facilitar o trabalho.

No menu PROJECT clique em Add Class e informe o nome InformacaoAssembly.vb e clique no botão Add;



A seguir digite o código abaixo nesta classe:

Imports System.IO
Imports System.Reflection

Public Class InformacaoAssembly

    Private ReadOnly assembly As Assembly

    Public Sub New(assembly As Assembly)
        If assembly Is Nothing Then
            Throw New ArgumentNullException("assembly")
        End If
        Me.assembly = assembly
    End Sub

    ''' <summary>
    ''' Obtem o titulo do assembly
    ''' </summary>

    Public ReadOnly Property ProductTitle() As String
        Get
            Return GetAttributeValue(Of AssemblyTitleAttribute)(Function(a) a.Title,
Path.GetFileNameWithoutExtension(assembly.CodeBase))
        End Get
    End Property

    ''' <summary>
    ''' Obtem a versão da aplicação
    ''' </summary>

    Public ReadOnly Property Version() As String
        Get
            Dim result As String = String.Empty
            Dim version__1 As Version = assembly.GetName().Version
            If version__1 IsNot Nothing Then
                Return version__1.ToString()
            Else
                Return "1.0.0.0"
            End If
        End Get
    End Property

    ''' <summary>
    ''' Obtem a descrição da aplicação
    ''' </summary>

    Public ReadOnly Property Description() As String
        Get
            Return GetAttributeValue(Of AssemblyDescriptionAttribute)(Function(a) a.Description)
        End Get
    End Property

    ''' <summary>
    '''  Obtem o nome completo do assembly
    ''' </summary>

    Public ReadOnly Property Product() As String
        Get
            Return GetAttributeValue(Of AssemblyProductAttribute)(Function(a) a.Product)
        End Get
    End Property

    ''' <summary>
    ''' Obtem a informação de copyright do produto
    ''' </summary>

    Public ReadOnly Property Copyright() As String
        Get
            Return GetAttributeValue(Of AssemblyCopyrightAttribute)(Function(a) a.Copyright)
        End Get
    End Property

    ''' <summary>
    ''' Obtem a informação da Empresa do produto
    ''' </summary>

    Public ReadOnly Property Company() As String
        Get
            Return GetAttributeValue(Of AssemblyCompanyAttribute)(Function(a) a.Company)
        End Get
    End Property

    Protected Function GetAttributeValue(Of TAttr As Attribute)(resolveFunc As Func(Of TAttr, String),
Optional defaultResult As String = Nothing) As String
        Dim attributes As Object() = assembly.GetCustomAttributes(GetType(TAttr), False)
        If attributes.Length > 0 Then
            Return resolveFunc(DirectCast(attributes(0), TAttr))
        Else
            Return defaultResult
        End If
    End Function

End Class

Poderíamos ter criado métodos estáticos (Shared) na classe acima. Fica a seu  critério alterar o código.

No evento Click do botão Procurar inclua o código abaixo para abrir a caixa de diálogo OpenFileDialog:

 Private Sub btnProcurar_Click(sender As Object, e As EventArgs) Handles btnProcurar.Click

        Dim ofd1 As New OpenFileDialog

        ofd1.Multiselect = False
        ofd1.Title = "Selecionar Assembly"
        ofd1.InitialDirectory = "C:\_vbn"
        'filtra para exibir somente arquivos .exe
        ofd1.Filter = "Assembly (*.EXE)|*.EXE"
        ofd1.CheckFileExists = True
        ofd1.CheckPathExists = True
        ofd1.FilterIndex = 2
        ofd1.RestoreDirectory = True
        ofd1.ReadOnlyChecked = True
        ofd1.ShowReadOnly = True

        Dim dr As DialogResult = ofd1.ShowDialog()

        If dr = DialogResult.OK Then
            txtAssembly.Text = ofd1.FileName
        End If
    End Sub

Agora é só alegria; basta usar a classe no seu projeto.

Para isso vamos incluir o código no evento Click do botão - Obter Informações do Assembly - conforme abaixo:

Private Sub btnAssemblyInfo_Click(sender As Object, e As EventArgs) Handles btnAssemblyInfo.Click

      Dim assemblyInfo As InformacaoAssembly
        Try
            If String.IsNullOrWhiteSpace(txtAssembly.Text) Then
                assemblyInfo = New InformacaoAssembly(Assembly.GetExecutingAssembly())
            Else
                Dim novoAssembly As Assembly = Assembly.LoadFrom(txtAssembly.Text)
                assemblyInfo = New InformacaoAssembly(novoAssembly)
            End If

            txtInfo.Text += "Company: " + assemblyInfo.Company + vbNewLine
            txtInfo.Text += "Copyright: " + assemblyInfo.Copyright + vbNewLine
            txtInfo.Text += "Description: " + assemblyInfo.Description + vbNewLine
            txtInfo.Text += "Product: " + assemblyInfo.Product + vbNewLine
            txtInfo.Text += "ProductTitle: " + assemblyInfo.ProductTitle + vbNewLine
            txtInfo.Text += "Version: " + assemblyInfo.Version + vbNewLine

        Catch ex As Exception
            MessageBox.Show("Erro : " + ex.Message, "Erro", MessageBoxButtons.OK, MessageBoxIcon.Error)
        End Try
    End Sub

Para obter informação de outro assembly basta selecionar o arquivo. Para obter informações do assembly da aplicação local basta deixar a caixa de texto vazia e clicar

Executando o projeto iremos obter o seguinte resultado:

Pegue o projeto completo aqui : Assembly_Info_vbn.zip

Porque pela graça sois salvos, por meio da fé; e isto não vem de vós, é dom de Deus.
Não vem das obras, para que ninguém se glorie;
Efésios 2:8,9

Veja os Destaques e novidades do SUPER DVD Visual Basic (sempre atualizado) : clique e confira !

Quer migrar para o VB .NET ?

Quer aprender C# ??

Quer aprender os conceitos da Programação Orientada a objetos ?

Quer aprender o gerar relatórios com o ReportViewer no VS 2013 ?

  Gostou ?   Compartilhe no Facebook   Compartilhe no Twitter

Referências:


José Carlos Macoratti