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çalvesPorque: 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
- Entity Framework 4: Repositório GenéricoVisual Basic .NET
- As edições 14 da Easy .net Magazine e 88 da .net Magazine já estão disponíveis.ADO.NET
- Postando no Twiiter com .NET e Migre.meC#
- Setup ApplicationsVisual Basic .NET
- Problemas na manipulação de arquivos do MS Excel com .NETVisual Basic .NET