Exportar (0) Imprimir
Expandir Tudo

Visual Studio.NET

WinControls carregados dinamicamente

Por Mauro Sant'Anna santanna@mas.com.br ). Mauro é um "MSDN Regional Director", consultor e instrutor da MAS Informática ( www.mas.com.br ), tendo ministrado treinamentos na arquitetura .NET desde outubro de 2000.

Em um artigo anterior, mostrei como criar WinControls e também como chamá-los a partir do Internet Explorer, dentro de uma página Web. Os WinControls podem ser usados tanto a partir de um aplicativo Windows como dentro do navegador sem modificações.

Existe um truque adicional que podemos fazer com os WinControls: carregá-los dinamicamente a partir de DLLs. Isto traz algumas vantagens:

  • Permite que um aplicativo possa ser modificado e estendido sem necessidade de recompilação. Basta recompilar o WinControl que foi modificado e redistribuir a DLL na qual ele se encontra, sem necessidade de alterar e redistribuir o resto do aplicativo;

  • Podemos criar um aplicativo que funciona como um "esqueleto" e carrega os demais WinControls conforme determinado por um banco de dados, já que tanto o nome das DLLs como os nomes das classes que implementam os WinControls são strings.

Um WinControl por DLL

Criarei dois WinControls bastante simple, um em cada DLL. Embora seja perfeitamente possível colocar mais de um WinControl por DLL, isto simplifica o exemplo. Veja na tabela a seguir os nomes dos projetos, namespace e classe utilizados:

 

DLL

Namespace

WinControl

Primeiro

Verde.dll

Verde

CVerde

Segundo

Azul.dll

Azul

CAzul

Criando o projeto de testes

Inicialmente criaremos o projeto do tipo "Windows Application" para testes. Este projeto irá "hospedar" os controles. Peça "File | New Project | Windows Application":

vbnet_webform2_01.gif

O projeto recém-criado contém apenas um formulário vazio (por enquanto):

vbnet_webform2_02.gif

A seguir adicionaremos o primeiro WinControl,o "Verde". Clique com o botão direito sobre a solução exibida no "Solution Explorer" e peça para acrescentar um novo projeto:

vbnet_webform2_03.gif

Selecione "Windows Control Library": e dê o nome "Verde"

vbnet_webform2_04.gif

Veja o projeto recém-criado:

vbnet_webform2_05.gif

Vamos alterar o nome do controle para "CVerde", trocar a cor de fundo do controle para verde e acrescentar alguns componentes (não importa muito quais):

vbnet_webform2_06.gif

Acrescente agora outro WinControl em um projeto chamado "Azul", mude o nome dele para "CAzul" e a cor de fundo para azul:

vbnet_webform2_07.gif

Modificaremos agora o diretório na qual os três projetos são criados. Em cada um deles, clique com o botão direito sobre o nome do projeto (Azul,Teste e Verde) e altere o diretório de saída para "c:\Temp":

vbnet_webform2_08.gif

Precisamos agora colocar o código que chamará os controles dinamicamente. Vá até o projeto de teste e coloque dois Label,dois TextBox, um Button e um Panel, conforme mostrado abaixo. Observe que o Panel ocupa toda a parte inferior do formulário:

vbnet_webform2_09.gif

Digite agora o seguinte código para ser chamado no evento "Click" do botão:

private void button1_Click(object sender, System.EventArgs e) { private void button1_Click(object sender, System.EventArgs e) { 
// A princípio não tem erro 
string Msg = ""; 
// Verifica se o nome da DLL e do tipo foram preenchidos 
if ((textBox1.Text == "") || (textBox2.Text == "")) { 
Msg = "Forneça o nome da DLL e do tipo"; 
} 
else { 
try { 
// Carrega o controle da DLL 
Carrega(textBox1.Text, textBox2.Text, panel1); 
} 
// Trata arquivo não achado 
catch (System.IO.FileNotFoundException) { 
Msg = "Arquivo não achado"; 
} 
// Trata classe inexistente 
catch(NullReferenceException) { 
Msg = "Classe não achada"; 
} 
} 
// Exibe mensagem de erro 
if (Msg != "") { 
MessageBox.Show(Msg); 
} 
}

O código acima chama as funções abaixo que também devem ser digitadas dentro do formulário:

using System.Reflection; 
. . . 
// Objeto associado à DLL atualmente carregada 
Assembly Lib = null; 
// Objeto associado ao WinControl atualmente carregado 
Control Ctrl = null; 
// Nome do tipo atualmente carregado 
string NomeAtual = ""; 
// Carrega um WinControl, dada a DLL, o nome do tipo e o controle anfitrião 
void Carrega(string DLL, string Nome, Control Anfitriao) { 
// Ignora se pedir para carregar o atual 
if (Nome == NomeAtual) 
return; 
// Muda cursor para ampulheta 
Cursor = Cursors.WaitCursor; 
try { 
// Verifica já existe algo carregado 
if (Ctrl != null) { 
// Remove o controle do painel 
Anfitriao.Controls.Remove(Ctrl); 
// Mata o controle 
Ctrl.Dispose(); 
// Permite a liberação do controle 
Ctrl = null; 
} 
// Verifica se a DLL está carregada 
if (Lib != null) { 
// Permite a liberação 
Lib = null; 
} 
// Atualiza nome atual 
NomeAtual = Nome; 
// Carrega DLL 
Lib = Assembly.LoadFrom(DLL); 
// Cria objeto cujo nome do tipo foi passado 
object Ob = Lib.CreateInstance(Nome); 
// Sabemos que é um WinControl 
Ctrl = (Control) Ob; 
// Preenche todo espaço disponíel 
Ctrl.Dock = DockStyle.Fill; 
// Coloca dentro do painel 
Anfitriao.Controls.Add(Ctrl); 
} 
// Restaura cursor 
finally { 
Cursor = Cursors.Default; 
} 
}

Rode o programa e peça para carregar o controle "Verde":

vbnet_webform2_10.gif


Veja agora o azul:

vbnet_webform2_11.gif

O código faz basicamente o seguinte:

  • Carrega a DLL (ou "assembly") dado seu nome com o método Assembly.LoadFrom;

  • Chama CreateInstance para criar uma cópia de um objeto dado o nome do tipo como string;

  • Faz um "cast" para Control;

  • Adiciona à lista de componentes do Panel e muda a propriedade Dock para ocupar todo o espaço disponível.

Existe também código de tratamento de erro e para "arrumar a casa". O importante é ver como é simples quebrar um projeto em vários WinControls,colocá-los em diferentes DLLs e a seguir chamá-los de maneira totalmente dinâmica.

Conclusão

Carregar os WinControls em tempo de execução dá uma grande flexibilidade no projeto de aplicativos, pois podemos alterar partes do aplicativo sem precisar recompilá-los e redistribuí-los.


No próximo artigo mostrarei como utilizar técnica semelhante para carregar os WinControls dinamicamente a partir da Web e hospedá-los no Internet Explorer.

Faça o download deste documento:

WinControls carregados dinamicamente

Top Of Page  formato Word , 388 Kb    

A Microsoft está realizando uma pesquisa online para saber sua opinião sobre o site do MSDN. Se você optar por participar, a pesquisa online lhe será apresentada quando você sair do site do MSDN.

Deseja participar?
Mostrar:
© 2015 Microsoft