Desenvolvimento - Visual Basic .NET

Aumentando produtividade da sua empresa com DLL´s referenciadas dinâmicamente e Menus Dinâmicos

Muitas empresas de software tem problemas com as atualizações de seus sistemas em seus clientes, seja por causa do tamanho do executável, ou por incompatibilidade de versões de um cliente para o outro, sendo que cada cliente pode der uma quantidade diferente de forms em seu sistema, gerando assim, vários executáveis diferentes.

por Francisco Gonçalves



Porque: Resolvi escrever esse artigo, pois quando procurei uma solução para o meu problema, não encontrei nada que me ajudasse, e espero que vocês também possam usar em seus projetos.

O Problema: Muitas empresas de software tem problemas com as atualizações de seus sistemas em seus clientes, seja por causa do tamanho do executável, ou por incompatibilidade de versões de um cliente para o outro, sendo que cada cliente pode der uma quantidade diferente de forms em seu sistema, gerando assim, vários executáveis diferentes

A solução: Resolveremos esses problemas, com forms dentro de Dll´s referenciadas dinâmicamente, pois assim, se voce tem por exemplo 4 DLL´s em uma determinada pasta do seu sistema ficara com um total de 4 form´s, se você tiver apenas duas DLL´s na pasta, o seu sistema terá apenas dois forms a serem usados. Com isso você solucionará os problemas de atualização e a variedade de sistemas de uma empresa para outra, pois quando você tiver uma atualização de form, você somente irá mexer na DLL correspondente, e enviá-la para o cliente, pois o executável principal, que só tera o MDI dentro dele, irá reconhecer Form alterado automaticamente.

Vamos a Prática: Primeiro Criaremos o nosso form dentro da DLL. No VS2005 => File => New => Project. Escolha “Class Library” e de o nome de Cadastro => OK.

No Solution Explorer adicione um novo Form e remova o Class1.vb que foi criado automaticamente pelo VS

Escolha Windows Forms e de o nome de Extform.vb

Criaremos uma aplicação simples, para apenas mostrar as partes importantes do código. Adicione um Button no centro do form

Insira o código =>

Public Class Extform

Dim nomeglobal As String

Sub recbvar(ByVal nome As String)

nomeglobal = nome

End Sub

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

MsgBox(nomeglobal)

End Sub

End Class

Estamos criando na linha 2 dentro da Classe ExtFrom, uma variável do tipo String.

Da linha 3 alinha 5 estamos criando uma Sub para receber a variável do form principal e copiar o seu valor para a variável nomeglobal.

Da linha 4 a 6 estamos colocando um msgbox para exibir a variável recebida do form principal, esse comado ficara dentro do evento click do Button1

E pronto. Basta apenas você compilar da mesma forma que voce faz com uma DLL normalmente e salvar

Agora iremos para a criação do nosso Form Principal.

Inicie um Novo VS Clique em File => New => Project. Escolha “Windows Applications” e de o nome de FormPrincipal => OK.

Entre no código em começe a digitar..

Imports System.io

Imports System.Reflection

Public Class Form1

Private mMenu As New System.Windows.Forms.MainMenu()

Dim ppath As String = "F:\"

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

Me.Menu = mMenu

Dim nome As String

With mMenu.MenuItems.Add("mnuArquivo")

.Text = "&Arquivo"

For Each nome In Directory.GetFiles(ppath)

If System.IO.Path.GetExtension(nome) = ".dll" Then

With .MenuItems.Add(nome, New EventHandler(AddressOf mnuAbrir_Click))

.Text = Replace(Replace(nome, ppath, ""), ".dll", "")

End With

End If

Next

End With

End Sub

Private Sub mnuAbrir_Click(ByVal sender As Object, ByVal e As System.EventArgs)

Dim nomepar As String = "Francisco"

Dim extAssembly As Assembly

extAssembly = Assembly.LoadFrom(ppath & CType(sender, MenuItem).Text & ".dll")

Dim extForm As Form

extForm = extAssembly.CreateInstance(CType(sender, MenuItem).Text & ".Extform")

Me.AddOwnedForm(extForm)

extForm.GetType().GetMethod("recbvar").Invoke(extForm, New Object() {nomepar})

extForm.ShowDialog()

End Sub

End Class

Na primeira e na segunda linha, importamos o system.io e o system.reflection, para podermos mexer com arquivos e com dll´s dinâmicas respectivamentes

Em seguida criamos a variável mMenu do tipo Menu

Dentro do Form Load, criamos uma rotina para que adicione os item no menu, conforme for encontrando DLL´s na Pasta especificada, e também estão sendo criada a referência de cada submenu com o seu evento.

Depois criamos a Sub MnuAbrir_Click, que é o evento chamado quando clicamos em um item do menu. Dentro da sub, inserimos um código de referenciação dinâmica de DLL´s e de passagem de parâmetros para ela. Ex:

Criando a String que será passada ao nosso form dentro da dll
Dim nomepar As String = "Francisco"

Criando uma variável do tipo Assembly
Dim extAssembly As Assembly

extAssembly recebe o caminho da dll para a execução dela
extAssembly = Assembly.LoadFrom(ppath & CType(sender, MenuItem).Text & ".dll")

Criando uma variável do tipo Form
Dim extForm As Form

Criando uma Instância com o nome do form da dll, que deverá ser padrão em todas as suas dll´s
extForm = extAssembly.CreateInstance(CType(sender, MenuItem).Text & ".Extform")

Adicionando esse novo form ao form atual
Me.AddOwnedForm(extForm)

Passando a variável para o novo form adicionado aonde “recebvar” é o nome da sub na dll que recebe os parâmetros, extForm é o nome do Form e “nomepar” é o parâmetro que vai ser passado a DLL
extForm.GetType().GetMethod("recbvar").Invoke(extForm, New Object() {nomepar})

Abrindo o Form
extForm.ShowDialog()

E Finalmente: Esta pronta a solução, execute-a e veja se irá ajudar você na sua empresa. Insira mais DLL´s retire algumas, e deixe que o programa cuide dos menus para você. Agora em cada cliente você terá um sistema personalizado, e rodando o mesmo executável. E se você precisar atualizar uma form, é só enviar a DLL correspondente.

Claro que isso foi um pequeno exemplo desse maravilhoso recurso, cabe a você agora aprimorá-lo.

Este foi meu primeiro artigo, espero que voces tenham gostado. Críticas, duvidas e sugestões, só postarem no tópico que eu responderei.

Francisco Gonçalves
francisco@eris.com.br

Francisco Gonçalves

Francisco Gonçalves