Skip Navigation Links



Translate this page now :



»Programação
»Programação.NET
»Banco de Dados
»Webdesign
»Office
» Certificações Microsoft 4
»Treinamentos4
»Programação 4
»Webdesign«
»Office & User Tips«
»Grupos de UsuĆ”rios
»CĆ©lulas AcadĆŖmicas«

O melhor teclado da microsoft
Você já está cadastrado e participa do grupo de usuários de sua cidade ? Se não, comente o porque.
 
 
FaƧa um pequeno teste com 10 questƵes de VB
.:.
Teste seus conhecimentos em Visual Basic, SQL Server e ASP 3.0 com nossas provas on-line
.:.
Aprimore seus conhecimentos em programaĆ§Ć£o com nosso treinamento on-line de lĆ³gica de programaĆ§Ć£o
.:.
Veja nosso calendƔrio de treinamentos
Gostou da PƔgina?
Então

para um amigo!

Pesquisa personalizada
Pesquisar Dicas:

 







Deployment sob demanda com ClickOnce

Eis mais um artigo sobre o ClickOnce. Mas vamos um pouco além do tradicional Next-Next-Finish.

Afinal de contas, o que é o ClickOnce ?

Para responder a esta pergunta, precisamos recorrer a um pouco de história. Quando a web surgiu atraiu a todos, não apenas aqueles que desejavam uma presença na web, mas também desenvolvedores de software que começaram a desenvolver para web aplicações que iriam funcionar internamente na empresa. Por que ?

A resposta é muito simples : Por causa do deployment de aplicações windows na época. Era um verdadeiro caos, muito difícil. A empresa sempre gastava muito dinheiro : Ou gastava muito dinheiro com muitos profissionais para resolverem problemas máquina por máquina ou gastava muito dinheiro com software e tecnicos especializados na operação de softwares para distribuição em massa de aplicações.

Com a web, o custo evaporou-se, foi a zero. Foi o sonho de todos, por isso todos foram para a web, apesar da interface ser levemente inferior a windows (algumas coisas, como drag-and-drop, são no mínimo muito difíceis de fazer).

Mas os recursos de deployment evoluiram, especialmente com a chegada do .NET . O framework já estaria instalado nas máquinas client, então o deployment de uma aplicação seria muito mais simples.

Surgiram então duas alternativas de deployment :

SmartClients : Passamos a chamar de smartClients as aplicações windows que utilizam deployment via browser. Podemos chama-las diretamente pelo browser e a aplicação é imediatamente downloadeada para o client, mas não por inteiro e sim apenas seu executável. Os demais assemblys (.dlls) apenas serão baixados quando o usuário disparar na aplicação a funcionalidade que os utiliza.

Updater Application Block : Trata-se de um pattern, um conjunto de bibliotecas desenvolvida pela Microsoft com o objetivo de fornecer um padrão de desenvolvimento para que chegue neste resultado, uma aplicação atualizável. Quando devidamente aplicado, o resultado é termos uma aplicação que checa por atualizações em seu servidor de origem sempre que é aberta, baixando as atualizações em background, mantendo-se sempre atualizada.

Ambas são soluções legais, mas incompletas. Em cada um, falta exatamente o outro. A idéia da Microsoft foi então juntar os dois : Aplicações auto-atualizáveis com download sob demanda pela web. Foi então que surgiu o clickOnce.

Em sua forma básica o ClickOnce funciona como o Updater Application Block : Uma aplicação que checa por atualizações em seu servidor de origem.

Vamos montar uma aplicação bem simples e fazer o deployment com o clickonce para que você possa observar isso:

1) Crie um novo projeto Windows

2) Altere a propriedade isMDIContainer para true

3) Insira um novo MainMenu no form

4) Adicione 1 Menu Principal "Opções" e 3 subMenus, "Item 1", "Item 2" e "Item 3"

5) Adicione mais 3 projetos do tipo ClassLibrary na solução, PrjHello1, PrjHello2 e PrjHello3

6) Em cada um, troque o nome da classe para clHello1, clHello2 e clHello3 respectivamente

7) Codifique cada uma das classes como abaixo, com mensagens diferentes :

   66 Public Class clHello1

   67     Public Sub Hello()

   68         MsgBox("Alo! Alo !")

   69     End Sub

   70 End Class

 

8) No projeto windows, adicione references para os outros 3 projetos.

9) Codifique os 3 itens de menu da seguinte forma :

   45     Private Sub Item1ToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Item1ToolStripMenuItem.Click

   46 

   47 

   48         Dim obj As New prjHello1.clHello1

   49         obj.Hello()

   50     End Sub

   51 

   52     Private Sub Item2ToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Item2ToolStripMenuItem.Click

   53 

   54 

   55         Dim obj As New prjHello2.clHello2

   56         obj.Hello()

   57     End Sub

   58 

   59     Private Sub Item3ToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Item3ToolStripMenuItem.Click

   60 

   61 

   62         Dim obj As New prjHello3.clHello3

   63         obj.Hello()

   64     End Sub

 

10) Rode a aplicação e teste seu funcionamento.

11) Clique com o botão direito no projeto e utilize a opção Publish para fazer uma publicação da aplicação para o servidor web.

12) Utilizando a página criada pela publicação da aplicação, instale a aplicação.

13) Observe os arquivos da aplicação instalados em c:\Documents and Settings\<usuario>\Local Settings\apps\2.0\<codigo>\<codigo>\<codigo> . A localização pode variar de acordo com a instalação do seu sistema operacional. As últimas pastas tem seu nome em código, mas você não terá dificuldade de identifica-las.

14) Pare o servidor web e rode a aplicação. Observe que a aplicação roda de forma independente do servidor web, como acontece com o Updater Application Block, ao contrário dos smartClients.

15) Altere a mensagem da classe clHello1

16) Recompile a solução

17) Publique novamente a aplicação. Observe que a identificação de versão é alterada.

18) Rode a aplicação normalmente, pelo start menu. Chame o 1o item de menu, que dispara a mensagem da dll alterada. Observe que a aplicação se atualizou e a mensagem encontra-se atualizada, exatamente da forma como ocorre com o Updater Application Block.

Para que o clickOnce permita, além da checagem de atualizações, o download sob demanda de partes da aplicação, precisaremos programar um pouco mais.

Primeiramente, precisamos agrupar os arquivos, criando desta forma conjuntos para download. A partir do momento que agrupamos os arquivos estes já não são considerados como obrigatórios na aplicação, por isso não são instalados automaticamente no setup inicial da aplicação.

Então vamos fazer isso, passo a passo :

1) Entre nas propriedades do projeto

2) Clique em Publish

3) Clique em Application Files

4) Vamos alterar o download group das DLLs. Abra a caixa de download group, clique em New e digite um novo nome para o download group. Coloque cada dll em um download group diferente, com o nome da dll, sem extensão.

Estes assemblies não serão instalados junto com a aplicação, mas também não são instalados sob demanda. A instalação sob demanda não é automatica, precisaremos programa-la, mas é simples.

Toda aplicação .NET roda isolada no que é chamado de um Application Domain, ou AppDomain para os íntimos. A carga de novos Assemblies para a memória é um evento, um acontecimento a nível de application domain, os assemblies são carregados para dentro do AppDomain.

O que precisamos fazer é interceptar um evento existente no AppDomain chamado AssemblyResolver. Esse evento é disparado sempre que o .NET procura um Assembly e não encontra. A tarefa de nossa aplicação é identificar a que grupo de arquivos esse Assembly pertence e realizar o download do respectivo grupo de arquivos.

Veja o código para este evento, criado em um módulo :

    1 Imports System.Reflection

    2 Public Module Domain

    3     Public Function MyResolveEventHandler(ByVal sender As Object, ByVal args As ResolveEventArgs) As [Assembly]

    4 

    5 

    6         If My.Application.IsNetworkDeployed Then

    7 

    8             Dim nomes As String()

    9             Dim dllname As String

   10             Dim newAssembly As Assembly

   11             nomes = args.Name.Split(",")(0).Split(".")

   12 

   13             dllname = nomes(0)

   14 

   15             My.Application.Deployment.DownloadFileGroup(dllname)

   16 

   17             Try

   18                 newAssembly = Assembly.LoadFile(Application.StartupPath + "\" + dllName + ".dll")

   19 

   20             Catch e As Exception

   21                 Throw New ApplicationException("A carga falhou", e)

   22 

   23             End Try

   24             Return (newAssembly)

   25         Else

   26             Throw New ApplicationException("Assembly não pode ser encontrado nem baixado")

   27 

   28         End If

   29     End Function

   30 End Module

Vejam os passos que são realizados neste código :

1) A assinatura do método é feita de acordo com o evento AssemblyResolve de um application domain

2) Primeiro testamos se a aplicação foi instalada via clickOnce. Se não foi, o problema é outro, não podemos fazer nada.

3) Obtemos então do parâmetro args o nome do assembly do qual a aplicação está precisando.

4) No nosso caso, temos um assembly por grupo de arquivos e o grupo de arquivos tem exatamente o nome do assembly, o que facilita as coisas. Em casos mais complexos precisariamos que nosso código estivesse fazendo um mapeamento entre nome de assembly e nome do grupo de arquivos

5) Utilizamos o Assembly.LoadFile para carregar o assembly em memória, montando o caminho a partir do caminho da aplicação. Funcionando, retornamos nosso assembly

Ainda falta um detalhe : Precisamos vincular esta rotina que encontra-se em um módulo com o evento de nosso application domain. Para fazer isso vamos utilizar um evento de start da aplicação. Então entre nas propriedades da aplicação e clique no botão "View Application Events".

Na janela de código que aparecerá, crie o seguinte código no evento Application_Startup :

 

   31 Friend Class MyApplication

   32 

   33         Private Sub MyApplication_Startup(ByVal sender As Object, ByVal e As Microsoft.VisualBasic.ApplicationServices.StartupEventArgs) Handles Me.Startup

   34 

   35 

   36         AddHandler AppDomain.CurrentDomain.AssemblyResolve, AddressOf WinHello.Modulo.MyResolveEventHandler

   37 

   38 

   39     End Sub

   40 End Class

 

Para testar a aplicação, faça o seguinte :

1) Desinstale a aplicação, para podermos fazer um teste completo.

2) Faça um rebuild na solução

3) Publique a aplicação

4) Instale novamente

5) Observe o diretório da aplicação, conforme o caminho que indicamos antes. Verá que apenas o executável foi instalado.

6) Execute a aplicação

7) Observe que conforme você clicar nos itens do menu, as dlls correspondentes serão instaladas.

 

Com este exemplo vemos o ClickOnce funcionando como um misto das duas tecnologias : Ele tanto faz com que a aplicação tenha uma instalação e cheque suas atualizações on-line como também faz com que a instalação de partes da aplicação possa ser realizada por demanda.

Para completar você pode fazer ainda um teste adicional : Atualize uma das dlls e publique novamente. Verá que a atualização automatica da aplicação continua funcionando mesmo com os componentes opcionais e a DLL será atualizada.

 

Dennes Torres
MCAD,MCSD,MCSE,MCDBA

 





Envie seus comentįrios sobre este artigo

Nome :

E-mail :

Comentários :


Avise-me quando houverem novos comentįrios nesta pįgina

Veja abaixo os comentários já enviados :

Nome : Assis E-Mail : assis_softwise@hotmail.com
Parabéns Dennes

Muito bom o conteúdo, ja havia feito teste como o clikOne, mas não dessa forma.

www.comel.com.br
Nome : Antonio Francisco E-Mail : anfranet@anfranet.com
Já uso o ClickOnce, só gostaria de saber como indicar o local onde o sistema ira ser instalado, quando o cliente solicita a instalação do sistema atráves do browser.
Se alguém souber, eu agradeço.
Antonio
Nome : Claudio E-Mail : claudiocraveiro@uol.com.br
Estou começando com o clickonce agora, pois noto que as empresas estão intensificando sua utilização.
Nome : Glauco E-Mail : glaucomarcal@gmail.com
Olá Dennes !!

Gostaria de saber como faço para enviar arquivos de outros tipos além do executável ?

Por exemplo, meu sistema faz uso de alguns arquivos .xls que servem de modelo para exportação de dados, como eu faria para enviar esses arquivos .xls ?

obrigado
Glauco
Nome : Rodrigo E-Mail : txuhevis@hotmail.com
Boa matéria Dennes!

Gostaria de saber se, em um ambiente de rede onde eu venha disponibilizar minha aplicação juntamente com seus pré-requisitos, utilizando o recurso Click once, as estações deverão estar logadas com usuários que possuam direitos administrativos para que a instalação não apresente problemas. Pergunto isso porque estou diante deste cenário. Instalei a aplicação em um Servidor com Windows Server 2003 e as Estações, com Windows XP, são utilizadas por usuários com acesso limitado. Tive problemas quanto a isso, mas não sei ao certo se esta é a causa. Não sei se é válido, mas o arquivo ".LOG" gerado após o erro na instalação, me retornou o código HResult -2146697211 no momento em que tentou realizar o download do primeiro arquivo do .Net Framework 3.5 que é um dos pré-requisitos.
Nome : Dennes E-Mail : dennes@bufaloinfo.com.br
Oi,

O clickonce n?o exige direitos administrativos.

Abs,
Nome : 1 E-Mail : 1
-1'
Nome : -1' E-Mail : 1
1
Nome : 1 E-Mail : -1'
1
Nome : 1 E-Mail : 1
1
Nome : 1 E-Mail : 1
1
Nome : 1 E-Mail : 1
1
Nome : 1 E-Mail : 1
1
Nome : 1 E-Mail : 1
1
Nome : 1 E-Mail : 1
1
Nome : 1 E-Mail : -1'
1
Nome : 1 E-Mail : 1
1
Nome : 1 E-Mail : 1
1
Nome : 1 E-Mail : 1
1
Nome : -1' E-Mail : 1
1
Nome : 1 E-Mail : -1'
1
Nome : 1 E-Mail : 1
1
Nome : 1 E-Mail : 1
1
Nome : 1 E-Mail : 1
1
Nome : 1 E-Mail : 1
1
Nome : 1 E-Mail : 1
1
Nome : zxNX3YweDYr0 E-Mail : mk74g338ac@gmail.com
Yo2u78&1#;ll be ready finding solutions to save money, will these on can trust them a strategy to your debt challenges Beside this specific you can use online chance to provider your current benefits, are borrowed solely offer lower rates than others

::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
Conheça mais sobre o nosso site :

::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::



Quer saber mais?
Faça um curso na Búfalo Informática, Treinamento e Consultoria e
Prepare-se para o Mercado!
Veja o que a Búfalo tem para você.

ļæ½ BĆŗfalo InformĆ”tica, Treinamento e Consultoria - Rua Ɓlvaro Alvim, 37 Sala 920 - CinelĆ¢ndia - Rio de Janeiro / RJ
Tel.: (21)2262-1368 (21) 9240-5134 (21) 9240-7281 e-Mail:
contato@bufaloinfo.com.br