Desenvolvimento - ASP. NET

Distribuindo aplicações Windows Forms pela Web (parte 1)

Ao desenvolver uma aplicação Winforms que será distribuída pela WEB o desenvolvedor/arquiteto de software deve ter um pensamento diferente, para isso vamos entender como funciona.

por Alexandre Tarifa



A distribuição de aplicações sempre foi um grande problema, para resolver esse problema a WEB chegou e ficou, e hoje muitas aplicações são desenvolvidas em ambiente WEB.

Mas será que realmente todas essas aplicações deveriam ser WEB? Será que as limitações da WEB com controles pobres e às vezes tendo um desenvolvimento complicado em determinadas tarefas e preocupações com Browser, segurança, etc.

Com toda fragilidades e problemas da Web, o .Net trouxe uma possibilidade de se utilizar o melhor recurso da WEB, que é a distribuição, e o melhor de potência de aplicações que são os Windows Forms.

As aplicações Windows Forms possuem controles com muitas propriedades, eventos e com possibilidades que nunca serão batidas pela WEB.

Já imaginou a Folha de Pagamento da sua empresa rodando um fechamento na WEB? A Contabilidade inteira da sua empresa na WEB? Será que os usuários têm a mesma produtividade ao operar um sistema na WEB ou um sistema WINFORMS? Tenho certeza que para os usuários que "pilotam" um sistema o dia todo, a WEB é um caos.

Mas a distribuição pela WEB não é a única solução, mesclar as aplicações também é possível onde determinado trecho de uma aplicação fique na WEB e outras funcionalidades específicas sejam feitas em WINFORMS.

Possibilidades temos de sobra, mas vamos por a mão na massa! Vamos ver como utilizar esse recurso de distribuição.

Ao desenvolver uma aplicação Winforms que será distribuída pela WEB o desenvolvedor/arquiteto de software deve ter um pensamento diferente, para isso vamos entender como funciona.

A distribuição ocorre da seguinte maneira:

Um usuário clica em um link apontado para um executável .Net
O Executável é baixado no GAC (Global Assembly Cache)
A aplicação é executada.

OBS: O usuário deve ter o framework instalado na máquina.

Mas o que é GAC (Global Assembly Cache)?

É um local (diretório) específico do windows onde os assembly (Exe e DLL) são baixados, ficam armazenados e são gerenciados pelo framework.

O gerenciamento que o framework faz esta relacionado ao controle de versão do assembly e também em relação a performance que é maior porque o CLR encontrará rapidamente o assembly.

O GAC traz também a possibilidade de compartilhamento de assembly, ou seja, diversas aplicações podem utilizar o mesmo assembly sem que tenha a necessidade de várias versões.

Este cenário ocorre a primeira vez que o usuário clica no link e daí pra frente o framework gerencia as versões, etc.

Conclusão: Desenvolvo a aplicação normalmente e simplesmente indico o link na web? Definitivamente NÃO! A distribuição ocorre sob demanda, ou seja, conforme a sua utilização.

Nova conclusão: Desenvolvo minha aplicação da forma mais separada possível e com toda à parte de acesso a banco de dados utilizando Web Service assim conforme o usuário for utilizando os recursos do sistema o framework vais baixando automaticamente. Caso o sistema tenha 30 DLL´s e o usuário utilize somente 5, o usuário terá somente 5 DLL´s na sua máquina.

Simples? Sim, realmente é simples!!!

Um exemplo no mundo real

Em um sistema de faturamento temos alguns perfis de usuários:

Gerentes e Diretores (cerca de 200)- Visualizam relatórios
Secretárias (cerca de 400)- Preenchem a solicitação de faturamento
Administradores (cerca de 20)- Gerenciam todo o processo e imprimem as notas fiscais/faturas e boletos.

Solução:
Aplicação Web com o formulário de solicitação de faturamento e relatórios/consultas com a opção de exportar para o excel (sempre seguindo direitos de visualização de dados).

Aplicação Windows com toda a parte operacional do sistema com diversos cadastros, controles e principalmente a emissão de cerca de 300 Notas Fiscais/Faturas por dia e um fechamento diário com geração de arquivos para a integração com sistema contábil e gerencial. Vamos então ver um exemplo prático do funcionamento deste "processo":

Abra o Visual Studio 2003 e crie uma nova aplicação. Selecione File> New> Project. Selecione a linguagem Visual Basic, template Windows Application, coloque o nome Calculadora, indique um caminho e clique em OK.

O projeto é criado, será uma solução simples com 2 TextBox e 2 botões, o usuário entra com os valores e clica no botão soma ou subtração e o resultado é exibido em uma mensagem.

Como vamos desenvolver uma aplicação que será distribuída pela WEB, temos que dividir o máximo possível as funcinalidades, vamos criar dois projetos do tipo class library.onde uma DLL será responsável pela Soma e a outra pela Subtração.

No Solution Explorer clique com o botão direito do mouse sobre a solution, Add> Add New Project. Selecione Class Library e o nome Soma. Crie outro projeto de Class Library com o nome Subtração.

Temos agora uma aplicação Windows com a interface e duas DLL´s com a regra de negócio.

Vamos implementar primeiro o projeto de Soma, na classe Class1 adicione o seguinte código

Public Class Class1
    Public Function Soma(ByVal Valor1 As Integer, ByVal Valor2 As Integer) As Integer
        Return Valor1 + Valor2
    End Function
End Class

No projeto de subtração dentro da Class1 adicione o seguinte código:

Public Class Class1
    Public Function Subtracao (ByVal Valor1 As Integer, ByVal Valor2 As Integer) As Integer
        Return Valor1 - Valor2
    End Function
End Class

Pronto, temos a regra de negócio disponível. Agora temos somente que ligar a interface com a camada de negócios.

No projeto Winforms monte um formulário conforme a imagem abaixo:


Imagem 1 - Formulário

Execute a solution (F5) compilando todas as DLL´s e o Executável. Adicione as referências ao projeto Winforms clicando com o botão direito do mouse sobre o projeto> add reference. Selecione a janela Projects e adicione as duas DLL´s, conforme abaixo:


Imagem 2 - Adicionando as duas referências. No botão de SUBTRAÇÃO adicione o seguinte código:

Private Sub Subtracao_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) 
    Handles Subtracao.Click
        Dim Operacao As New Subtracao.Class1
        MessageBox.Show(Operacao.Subtracao(TextBox1.Text, TextBox2.Text))
End Sub

No botão de SOMATÓRIA adicione o seguinte código:

Private Sub Soma_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Soma.Click
        Dim Operacao As New Soma.Class1
        MessageBox.Show(Operacao.Soma(TextBox1.Text, TextBox2.Text))
End Sub

Execute a aplicação e teste as "super" funcionalidades.

A aplicação está pronta, agora vamos distribuí-la.

A distribuição é muito simples

Crie um diretório virtual no IIS, abra o IIS, clique com o botão direito do mouse sobre Site da Web Padrão, conforme a imagem abaixo:


Imagem 3 - Novo diretório virtual.

No Wizard clique em Next, e coloque o Alias como Calculadora, clique em Avançar, selecione como caminho a pasta Bin da aplicação que criamos (C:\Documents and Settings\Administrador\Meus documentos\Visual Studio Projects\Calculadora\), clique em avançar e concluir.

Temos criada o diretório virtual, porém devemos criar a página WEB com o link. Abra o Windows Explorer, selecione o caminho da aplicação até a pasta Bin e crie um arquivo com o nome Exemplo.html. Abra no NotePad e digite o seguinte código:

<HTML>
<b>Distribuição pela Web</B>
<br>
<a href=Calculadora.exe>Teste</a>
</HTML>

É o código mais simples possível para um entendimento mais fácil. Abra um browser e digite: http://localhost/Calculadora/Exemplo.html. A página web é exibida.

Antes de clicar sobre o link vamos acompanhar todo o processo. Abra o Visual Studio .NET 2003 Command Prompt , conforme imagem abaixo:


Imagem 4 - Caminho do prompt.

Neste prompt de comandos do VS vamos verificar como está o GAC da máquina cliente, para isso execute o comando:

Gacutil /ldl

Este comando lista todos os assembly já existentes na máquina, vamos limpar o GAC da máquina para um bom acompanhamento com o comando:

Gacutil /cdl

Agora com o GAC limpo, vamos clicar sobre o link, porém ainda não execute nenhum comando. Após o clique sobre o link, a aplicação é aberta, antes mesmo de testarmos os botões volte ao prompt e liste novamente o conteúdo do GAC:

Gacutil /ldl

Agora 1 ítem está presente dentro do GAC, este assembly é o executável da aplicação, ou seja, as DLL´s só serão baixadas após utilizadas.

Digite agora os valores nos campos e clique somente em subtração. O resultado é exibido, vamos listar novamente o GAC:

Gacutil /ldl

Agora temos 2 assembly, ou seja, caso o usuário nunca utilize a DLL soma, ela nunca será baixada. Clique agora em soma, liste o GAC:

Gacutil /ldl

Note que temos os 3 assembly listados.

A partir de agora o framework gerencia as versões, ou seja, caso existir alteração tanto no Exe como nas DLL´s, o download do novo assembly é efetuado, caso contrário é executado diretamente no cache da máquina.

Muito simples até agora, porém existe um problema muito preocupante! A SEGURANÇA, por exemplo, imagine que a minha aplicação cria um arquivo texto, ou deleta um arquivo da máquina... é um risco sério certo?

Toda esta questão de segurança será demonstrada na parte 2 deste artigo.

Se você tem interesse em aprender .net ou discutir .net entre no grupo de usuários Codificando.net - São Paulo (www.codificando.net).

Se tiver alguma dúvida, crítica, sugestão de artigo, fale comigo: alexandretarifa@gmail.com.

Abraços.

Alexandre Tarifa
Líder Codificando.net SP

Alexandre Tarifa

Alexandre Tarifa - Ministra palestras e treinamentos, MVP (Most Valuable Professional), MCAD (Microsoft Certified Application Developer) e MCT (Microsoft Certified Trainer). Bacharel pela UMESP e pós-graduando pela Universidade Federal de São Carlos em Ciência da Computação. Analista de Sistemas e Líder do grupo de usuários Codificando.net São Paulo (sp.codificando.net). Escreve artigos para a revista MSDN Magazine e para os sites Linha de Código, MSDN Brasil e Enterpriseguys.
Visite o blog do autor: http://weblogs.pontonetpt.com/alexandretarifa/.