quarta-feira, 2 de maio de 2012

Atualizando aplicações .NET de forma semelhante ao Google Chrome

O Google Chrome tem uma forma de atualização muito boa, que aos poucos está sendo adotada por várias outras aplicações. A grande vantagem das atualizações do Google Chrome é que elas ocorrem sem a intervenção do usuário e são constantes. Isso garante que o usuário sempre terá a versão mais nova da aplicação.

Pesquisei soluções para aplicações .NET que reproduzissem esse mesmo comportamento, permitindo atualizações constantes e sem a intervenção do usuário. Infelizmente não encontrei nenhuma solução pronta que atendesse minhas necessidades.

A primeira opção, logicamente, foi utilizar o ClickOnce. Mas, devido a suas limitações, ele não me atendeu. A seguir, procurei outras soluções, mas nenhuma atendia necessariamente aquilo que eu queria. Por fim, resolvi desenvolver eu mesmo um componente que resolvesse esse problema. Foi assim que surgiu o AppUpdater (sim, eu sei, esse nome é horrível).

Características do AppUpdater

As principais características do AppUpdater são:
  • as atualizações são feitas via web (download dos arquivos);
  • o processo de atualização não necessita da intervenção do usuário;
  • o tamanho de uma atualização é mínimo. A atualização faz o download apenas das partes modificadas de cada arquivo atualizado (deltas), mesmo em arquivos binários.
Vale ressalta um aspecto muito importante: o tamanho da atualização. O componente fará o possível para baixar a menor quantidade possível de dados.
  • Os novos arquivos são baixados de forma compactada (gzip). Com isso, um executável de 200 kB, fica com cerca de 60 kB;
  • Os arquivos que não foram alterados, não são baixados novamente;
  • No caso de arquivos modificados, apenas as partes alteradas são baixadas (delta). O componente faz o download do delta, aplica na versão antiga do arquivo e gera assim a nova versão. O tamanho do delta obviamente vai depender do que foi modificado. Apenas por curiosidade, adicionei a chamada a um MessageBox em uma aplicação de 200 kB, e o delta dessa alteração ficou com 639 bytes.

Utilizando o componente

Para utilizar o componente, recomendo a leitura da documentação. De forma resumida, o que deve ser feito para utilizá-lo é:
  1. a aplicação deve seguir uma certa estrutura de diretórios pré-determinada;
  2. deve existir um servidor web que irá disponibilizar as atualizações;
  3. a aplicação deve ativar o código que verifica as atualizações.
Para que o componente funcione, o único código necessário é o seguinte:
AutoUpdater autoUpdater = new AutoUpdater(UpdateManager.Default);
autoUpdater.SecondsBetweenChecks = 3600;
autoUpdater.Start();

Concluindo

Não vou repetir aqui o passo-a-passo de como utilizar o componente, acredito que a documentação já trate de todos os assuntos necessários para utilizá-lo.

Se algo não ficou claro, por favor, entre em contato. Eu altero a documentação ou posso criar um tutorial esclarecendo quaisquer dúvidas que surgirem.

Por fim, tenho que agradecer a Fernanda Moratelli que me ajudou no desenvolvimento do AppUpdater!