Introdução
ASP.NET é uma tecnologia que permite uma extensão incrivelmente poderosa, especialmente com a sua capacidade de criar Controles de usuários e Controles Customizados. Enquanto os Controles de Usuários e os Controles customizados são desenvolvidos para serem exibidos em um navegador, podem haver cenários do mundo real onde você deseja exibir um controle do Windows em um navegador da Web, embora existam algumas restrições de hospedagem para desenvolvimento destes novos controles. Existem vários benefícios que uma hospedagem de um controle pode fazer, dentre eles:

·         Oferecer maior funcionalidade, mais do que apenas o próprio ASP.NET pode oferecer. Por exemplo, treeviews complexas, desenhos complexos, e uma interação com o usuário são mais fáceis de construir em Windows Forms do que em ASP.NET;

·         Oferecer melhor performance, pelo motivo da sua funcionalidade complexa não necessitar de postback's. O Cliente faz download do controle apenas uma vez, e em seguida, pode interagir facilmente com o usuário sem a necessidade de uma repostagem no servidor.

·         Economia de tempo, porque o controle já pode estar construído, e ser suficientemente complicado de reconstruir em um movimentado projeto ASP.NET;

·         Agir como um passo intermediário para migrar um aplicativo do Windows para ou do ASP.NET;

Neste artigo, iremos analisar as etapas necessárias para iniciarem a hospedagem de um Controle Windows para uma página Web desenvolvida em ASP.NET.

Primeiro Pensamento: Criando um controle do Windows

Neste tópico será demonstrado como hospedar um simples Controle do Windows em três tipos de projetos:

1.    Uma Biblioteca de classe Windows, que contém apenas o controle por si mesmo

2.    Uma aplicação Windows que testa o controle, e

3.    Uma Aplicação Web ASP.NET, mostrando como hospedar um controle do Windows numa Pagina da Web.

Todos estes artigos estão disponíveis no final do artigo. Para iniciar, iremos criar uma solução em branco, chamaremos de ControleWindowsNoAspNet. Criar este controle na seguinte pasta: C:/inetpub/wwwroot, pois isto irá tornar-se mais fácil a interação com o projeto, mais tarde, na aplicação ASP.NET. Agora iremos adicionar para a Solution uma Biblioteca do Controle do Windows (NÃO é uma classe). O nome para este novo projeto é: ControleWindows. Para iniciar iremos criar um único Controle de Usuário chamado ArvoreWin. Arrastar um controle GroupBox neste controle, e então arrastar um controle TreeView dentro do GroupBox. Use a propriedade Text para o Titulo do GroupBox, e encapsule isto: (no C#)

public string Titulo

{

    get

    {

        return this.groupBox1.Text;

    }

    set

    {

        this. groupBox1.Text = value;

    }

}

Quando terminar, o controle do Windows irá se tornar mais ou menos como a imagem abaixo.


Agora iremos testar este controle adicionando um projeto de aplicação Windows (chamaremos de TesteControleWin) nesta Solution. Será muito mais fácil testar o Controle em uma Aplicação Windows, do que testar este controle em uma aplicação ASP.NET. Na toolbox existirá uma seção nova com o controle ArvoreWin, arraste este controle ArvoreWin para o formulário que está criado, Altere na janela de Propriedades, e altere a propriedade Titulo para "Meu Titulo". Defina a aplicação Windows como default e rode a aplicação. Simples não?

Agora vamos criar uma aplicação Web que irá consumir nosso controle que acabamos de criar. Adicione uma nova aplicação Web na solução e chamaremos de WebUI. No IIS, a aplicação precisará ser configurada na propriedade  "Executando Permissões" para "Apenas Scripts", onde o visual studio cria por padrão.


Copiar o caminho físico da DLL (diferentemente de adicionar uma referencia ) que se encontra dentro da pasta do projeto do controle Windows, para a pasta do projeto Web. Simplesmente adicionando uma referencia não estará habilitado referenciar um controle Windows. Se você precisar atualizar o projeto do Controle Windows, você necessitará re-copiar a DLL novamente, para que as alterações façam efeito.

Iremos criar um controle estático em um arquivo HTML, e nomearemos este arquivo como wFrmEstatico.aspx, e adicionaremos o seguinte código no corpo do HTML:

<OBJECT id="MeuPrimeiroControle" height="200" width="200" classid="http:ControleWindows.dll#ControleWindows.ArvoreWin" VIEWASTEXT>
    <PARAM NAME="Titulo" VALUE="Meu Titulo">
</OBJECT>

Se você algum dia já programou Applet do Java, notou que a semelhança das Tag's <OBJECT>. O elemento Object possui, ID, Altura (Height) e largura (width) como atributos. O ClassID é dividido em duas partes separados por # onde é a localização do código binário (DLL) no servidor e o Namespace do controle. Reparem que os Parâmetros São passados como <PARAM name="[Nome da Propriedade]" value="[Valor da Propriedade]">.

Quando você compilar e rodar sua aplicação ASP.NET, você verá um layout aproximadamente igual a imagem abaixo:


Adicionando Controles Windows dinamicamente

Para exemplificar a inserção de controles Windows dinamicamente em uma pagina Web ASP.NET, vamos analisar, o que você precisaria para criar um controle em tempo de execução (runtime)? Simples, adicione um controle literal. Para exemplificar isto, criaremos um segundo formulário Web. Chamaremos este formulário de wFrmDinamico.aspx. Adicione um controle Textbox, chamaremos este controle de txtTitulo, que irá alterar a propriedade Titulo, adicionar também um botão, e um controle Literal. Adicionar o seguinte código no evento Clique do botão:

string strTitulo = this.txtTitulo.Text;
string strObjeto = @"<OBJECT id='MeuSegundoControle' height='200' width='240' classid='http:ControleWindows.dll#ControleWindows.ArvoreWin' VIEWASTEXT><PARAM NAME='Titulo' VALUE='" + strTitulo + "'> </OBJECT>";
this.Literal1.Text = strObjeto;

O parâmetro TITULO, é alterado dinamicamente com o valor da caixa de texto txtTitulo. Você pode usar esta técnica para criar instancias do controle Windows em tempo de execução.

Limitações

Existem uma série de discussões sobre as limitações do controle Windows. Primeiramente, a maquina Cliente necessitará no mínimo .NET instalado e browser com Internet Explorer 5.01 ou superior.  Criar controles Windows é muito mais eficiente para aplicações INTRANET, porém, não é impossível criar aplicações para a internet, porém a eficiência não será a mesma. Em segundo lugar enquanto as aplicações ASP.NET podem receber Controles Windows e Controles Customizados, não pode receber o Formulário completo da aplicação, portanto, é necessário quebrar o aplicativo para obter um melhor resultado. Por ultimo, os Controles Windows não são controles para efetuarem postback's portanto, para ler estes dados durante um postback, será necessário um grande trabalho, pois como vimos anteriormente, passar parametros para o Controle é facil através da tag <PARAM porém receber estes valores é muito mais dificil, um outro diferencial, é que esta aplicação não roda em browsers FIREFOX.

Existem duas categorias de soluções para ler e escrever estes dados que são oriundos do controle Customizado/Windows. Talvez o mais facil seja que o próprio controle efetue as conexões e as transações, tal que não será necessario a execução dos postback's entre as paginas.  Uma outra possibilidade é gerar um XML para efetuar as transações, porém, será quase impossivel manter a agilidade na aplicação, pois será muito lento a transmissão destes arquivos. Esta é uma notavel limitação da criação de controles.

Conclusão

A hospedagem de controles Windows em aplicações ASP.NET oferecem um consideravel valor comercial. Voce copia apenas a DLL para um aplicativo ASP.NET, e adicionando a tag <OBJECT>. O Visual Studio cria por padrão as configurações necessárias para rodar a aplicação. Você consegue ainda mais, gerar dinamicamente controles windows, ou também deixar estático o que é de uma valia muito grande.

 

Agradeço ao criador deste artigo: Tim Stall 

Download do código in english
em portugês