![]() |
||||||||
|
||||||||
|
com exemplos em VB |
Componente para deixar forms em Vb semelhantes às telas do winnamp |
Componente para colocar sua aplicação VB no Systray |
Componente para transformar sua aplicação VB em serviço |
Ferramentas úteis para quem usa Olap Server |
![]() |
|
||||||||||||||||
![]()
Pesquisa personalizada
Late binding vai muito bem, obrigado Conceitos básicos de Reflection No VB 6, que utiliza o padrão COM, usavamos com frequencia o conceito de Late Binding. O Late Binding nos permite utilizar um determinado componente em Run Time, sem que tenhamos previsto que componente seria este em design time. Por exemplo, poderiamos guardar a identificação do componente em uma base de dados e instancia-lo em run-time através da instrução CreateObject. Essa identificação do componente está diretamente ligada com o padrão COM. Trata-se do ProgID do componente, formado por nomes de duas partes que identificam o componente e a classe em si. Por exemplo, "ADODB.Connection" identifica a classe connection do componente ADODB. Mas no .NET os componente que criamos não são COM e consequentemente não temos ProgID. Então como fazer o late binding neste ambiente ? É ai que entra o conceito de Reflection. Reflection é a capacidade que temos no .NET de manipular classes em run-time, sem sabermos exatamente que classe estamos manipulando, podendo descobrir todas as características da classe em run-time. Mas para isso precisamos identificar a classe de alguma forma. No COM tinhamos o progID, e no .NET ? No .NET, justamente por não termos o progid, o processo de Reflection é baseado no carregamento de um Assembly. A aplicação primeiramente carrega um assembly (.dll) para a memória, depois manipula seu conteúdo, criando instancias de suas classes e utilizando-as. Um exemplo simples pode ser feito para demonstrar o uso de Reflections. Siga esses passos : 1) No visual Studio, crie uma solução com dois projetos, um Windows Form e uma Class Library 2) Defina o nome do projeto Class Library e o nome da classe. Irei utilizar clsLate e clHello, respectivamente, apenas como exemplo. 3) Mais uma vez, apenas por questão de exemplo, monte o seguinte código na classe : Public Class clHello 4) Faça um rebuild do projeto da classe. Não precisa ser de tudo, apenas do projeto da classe. 5) Utilize o solution Explorer para copiar a dll clslate.dll do diretório bin do seu projeto original para o diretório bin da Windows Application. Observe que apesar de estarmos copiando a dll não estamos fazendo referencia a ela, o que, a principio, impediria o acesso a classe. 6) Insira um botão no formulário da Windows Application e chame-o de cmdHello 7) Monte o seguinte código : Private Sub cmdHello_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdHello.Click End Sub 8) Teste a aplicação Verá que apesar de não termos feito referência para o assembly, ele é carregado e a mensagem é exibida. O que o código faz é carregar um assembly pelo nome ("clsLate") e a partir dele instanciar objetos contidos dentro deste assembly, tal como clsLate.clHello . É interessante como a organização NameSpace.Classe fica semelhante ao formato do ProgID, mas isso acontece apenas nos projetos mais simples. Talvez você esteja agora se perguntando : "Mas eu vou ter que copiar o Assembly sempre que desejar fazer um acesso a ele ?". Não necessariamente. Realmente, para uma aplicação acessar um determinado assembly um dos primeiros locais que é examinado em busca dele é o diretório bin abaixo da aplicação. Mas caso o assembly não seja encontrado neste local a aplicação irá procurar o assembly no Global Assembly Cache. O GAC, como é popularmente chamado, é um cache de assemblys, permitindo que os assemblys possam ser acessados através de qualquer aplicação .NET na máquina (obedecendo as restrições de segurança, claro). Para controlarmos o conteúdo do GAC devemos estar utilizando uma aplicação chamada GACUTIL, que permite listar, inserir e remover assemblys do cache. Veja algumas sintaxes : GacUtil /l [<nome do assembly>] : lista os assemblys no cache Desta forma, não é preciso que a dll sempre seja copiada para junto da aplicação que a utilizará. Se o assembly estiver no Gac, a aplicação "client" irá localiza-lo sem problemas. Ok. Com isso então vimos um uso simples do recurso de Reflection. Porém este recurso pode realmente fazer muito mais que isso. Para demonstrar, vamos fazer um novo exemplo. Vamos criar uma aboutbox nesta windows application que começamos a desenvolver. Criem um novo Windows Form e deem o nome a ele de frmAbout. Dentro deste formulário vamos criar o seguinte código : Private Structure AssemblyAttributes Private Function GetAssemblyAttributes() As AssemblyAttributes A função GetAssemblyAttributes preenche uma structure do tipo AssemblyAttributes com os atributos do Assembly atual. O Assembly em questão é obtido através do método GetEntryAssembly da classe Assembly. Observem que é um método estático, ou seja, a classe não precisou ser instanciada para que o método possa ser utilizado. Para fazermos o preenchimento dos labels que esta aboutbox deverá possuir vamos utilizar a seguinte Sub : Private Sub SetFieldDefaults() Como podem observar, a sub SetFieldDefaults obtem um objeto AssemblyAttributes e o utiliza para preencher os labels existentes no formulário. Mas, observando em detalhes, você verá que nenhuma atribuição é feita diretamente para os labels. Este é realmente um excelente exemplo de encapsulamento onde a classe (formulário) fica encapsulada até dela mesma, tudo é acessado através de propriedades. Veja as propriedades :
'Allows user to get/set AboutBox Title bar text 'Allows user to get/set lblApplicationInfo 'Allows user to get/set lblVersionInfo 'Allows user to get/set lblCopyrightInfo 'Allows user to get/set lblCustomInfo Por fim, vamos configurar as características da nossa aplicação dentro do arquivo AssemblyInfo.vb . Veja como ficam as tags ; <Assembly: AssemblyTitle("AboutBase")> Pronto. Com isso temos uma aboutbox que estará sempre automaticamente preenchida de acordo com as informações do Assembly que tenham sido inseridas no AssemblyInfo.vb Temos então uma demonstração de até onde a Reflection pode nos levar. E isso é apenas o inicio, usando o recurso de Reflection todo o conteúdo de um assembly pode ser analisado e manipulado em run-time. Dennes Torres Dennes Torres possui as certificações MCAD,MCSD,MCSE e MCDBA , é diretor da Búfalo Informática (www.bufaloinfo.com.br) , empresa de treinamento do Rio de Janeiro e é líder do grupo de usuários DevASPNet (www.devaspnet.com.br) , grupo de usuários .NET do Rio de Janeiro.
|
||||||||||||||||
Veja abaixo os comentários já enviados :
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: Quer
saber mais?
Faça um curso na Búfalo Informática, Treinamento e Consultoria e Prepare-se para o Mercado! Veja o que a Búfalo tem para você. |
� Búfalo Informática,
Treinamento e Consultoria -
Rua Álvaro Alvim, 37 Sala 920 - Cinelândia - Rio de Janeiro / RJ
Tel.: (21)2262-1368 (21) 9240-5134 (21) 9240-7281 e-Mail: contato@bufaloinfo.com.br