Os arquitetos de aplicativo freqüentemente se debatem com duas metas importantes, mas concorrentes. Eles querem escrever um aplicativo rich client baseado em Windows® que rode no desktop porque isso fornece uma experiência mais interativa e stateful ao usuário. No entanto, eles também querem minimizar o esforço exigido para instalar e atualizar seus aplicativos — meta que apresenta mais resultados com um modelo thin client. Os usuários desejam aplicativos que sejam fáceis de usar e que não interfiram nos outros aplicativos em suas máquinas.
O ClickOnce, parte da versão 2.0 do Microsoft® .NET Framework, permite que você implante aplicativos rich client baseados em Windows em um desktop, colocando os arquivos do aplicativo em um servidor de arquivos ou Web e tornando-os acessíveis ao usuário por meio de um link.
Quando o usuário clica no link em uma página Web ou e-mail, os arquivos do aplicativo são baixados para a máquina do usuário e nela executados. O programa roda em um compartimento seguro fornecido pela CAS (code access security) do .NET, que limita o que é permitido fazer com base na evidência apresentada. Quando uma nova versão do aplicativo for instalada no servidor, ela será automaticamente detectada pelos clientes conectados e sua atualização poderá ser baixada e aplicada de diversas maneiras, de acordo com as configurações de implantação opcionais. O ClickOnce também permite que os aplicativos sejam implantados off-line, fazendo com que eles se comportem como se tivessem sido instalados na máquina local.
O ClickOnce utiliza inúmeros recursos já existentes no.NET Framework e no runtime, bem como alguns novos recursos introduzidos especificamente para ele. Para entender as proteções de segurança do ClickOnce, você precisa ter um bom conhecimento a respeito da CAS. Se você já foi apresentado à implantação no-touch no .NET 1.x, ou ao Updater Application Block da série Microsoft Patterns and Practices, provavelmente terá uma noção básica do que o ClickOnce pode fazer por você. O ClickOnce será ainda mais aperfeiçoado na próxima versão do Windows (codename "Longhorn”), por isso ele é um modelo de implantação no qual vale a pena investir para o futuro.
O principal objetivo do ClickOnce é fornecer um modelo de implantação confiável para que os usuários possam baixar e executar aplicativos de servidores gerenciados centralmente sem precisarem solicitar privilégios de administrador na máquina cliente. Eles foram implantados de uma maneira segura, que impede que os aplicativos implantados no ClickOnce interfiram ou corrompam outros aplicativos ou dados no cliente. Os aplicativos implantados com o ClickOnce também precisam ser executados em um contexto de execução seguro cujas permissões sejam limitadas de acordo com o local de onde o aplicativo está vindo ou com a confiança atribuída ao criador desse aplicativo.
O modelo de implantação do ClickOnce é objetivo e se aplica a qualquer aplicativo ClickOnce. No que se refere à atualização de aplicativos ClickOnce, existem várias opções de atualizações, que variam dependendo das escolhas feitas quando o aplicativo é publicado no servidor de instalação. Para esclarecer melhor os termos, vou me referir ao processo de instalação de arquivos de aplicativo no servidor como "publicação", e ao processo de instalação de arquivos de aplicativo em uma máquina cliente a partir do servidor de instalação via mecanismos do ClickOnce como "instalação". E, para diferenciar os dois tipos de aplicativos ClickOnce, vou me referir aos aplicativos instalados para oferecer suporte à execução off-line como aplicativos "instalados" (“installed”), e aos aplicativos que podem ser executados somente on-line como aplicativos "lançados" (“launched”).
Instalando o aplicativo pela primeira vez
O processo básico para executar pela primeira vez a instalação de um aplicativo por meio do ClickOnce é mostrado na Figura 1. Depois de desenvolver e testar o aplicativo, você publica o aplicativo no servidor de aplicação. Para fazer isso, é preciso apenas copiar todos os arquivos de aplicativo em uma pasta de um servidor Web ou de arquivos, juntamente com os arquivos de manifesto de instalação e de aplicativo (que descrevem a instalação do runtime do ClickOnce). Uma vez publicado os arquivos do servidor de aplicação, é fornecido ao usuário um link para o manifesto da aplicação de uma URL (como um hyperlink ou atalho). Quando um usuário clicar nesse link, o runtime do .NET na máquina cliente reconhecerá a extensão do arquivo e executará uma instalação ClickOnce do aplicativo, baixando e executando o aplicativo na área de trabalho do usuário.
Os arquivos são descarregados em um cache sob o perfil do usuário conectado na máquina local, em uma localização obscura (obfuscated). Em seguida, o aplicativo é executado com o contexto de segurança do CAS determinado pela localização do servidor de instalação, tal como uma zona Internet ou Intranet local. Você pode substituir a política baseada em localização padrão por uma política de segurança personalizada na máquina do usuário que dependa de evidência baseada em conteúdo (hash, publisher, ou strong name). Se você tiver uma evidência baseada em conteúdo que corresponda ao aplicativo instalado, serão usadas as permissões do grupo de código correspondente. No restante deste artigo, analisarei as proteções de segurança e as opções de configuração à medida que abordar alguns dos cenários de instalação.
Se o aplicativo ClickOnce tiver sido publicado para ser um aplicativo “launched”, então será o fim da história. O usuário precisará acionar o aplicativo por meio do link fornecido. Geralmente, ele será um link para um site Web, que aciona o aplicativo responsável pela funcionalidade relacionada ao objetivo do site. Cada vez que o usuário clicar no link, o runtime na máquina do usuário comparará a versão armazenada localmente com a versão no servidor de instalação. Se houver novos arquivos disponíveis, eles serão baixados antes de o aplicativo ser ativado. A versão armazenada localmente será então executada na área de trabalho do usuário. Esse processo é muito semelhante à instalação no-touch atual que utiliza o .NET 1.x.
No entanto, se o aplicativo tiver sido publicado como um aplicativo instalado (“installed”), não só ele será ativado na primeira vez que o usuário clicar no link fornecido como será criado um atalho para ele no menu Iniciar (por exemplo, Iniciar | Programas | MyCompany | MyClickOnceApp), para que o usuário possa acioná-lo por lá futuramente. Além disso, será adicionado um item ao applet Adicionar/Remover Programas (no Painel de Controle) para permitir que o usuário desinstale o aplicativo, um processo que simplesmente remove o atalho do menu Iniciar e limpa os arquivos do cache sob o perfil do usuário. O item Adicionar/Remover Programas também permite que o usuário retorne a uma versão anterior (caso tenham ocorrido atualizações).
A atualização dos aplicativos instalados se torna um pouco mais complicada em função das muitas opções disponíveis. Essas opções levam em conta diversos fatores, como, por exemplo, se as atualizações são verificadas automaticamente, se elas são obrigatórias, quando o aplicativo deve procurar atualizações disponíveis e se a atualização deve ser baixada antes de se iniciar o aplicativo ou em background (segundo plano), enquanto o aplicativo estiver em execução. Além disso, você pode executar atualizações por meio de programação, usando a API do ClickOnce e evitando os mecanismos de atualização automáticos. Descreverei esses cenários mais tarde, com o aplicativo de exemplo.
Projetando aplicativos ClickOnce
O ClickOnce é voltado para a implantação de aplicativos baseados em Windows na camada de apresentação. Ele não é um substituto da tecnologia Windows Installer (MSI) nem tampouco é indicado para todos os tipos de aplicativo. Conforme mencionei anteriormente, se um programa precisa executar operações privilegiadas que possam afetar outros aplicativos ou dados na máquina de destino, tais como ter acesso irrestrito a arquivos ou acessar o registry, é possível que ele não seja adequado para a implantação com o ClickOnce. Além disso, se um aplicativo necessitar de acesso privilegiado à máquina local no momento da instalação, ele não será, definitivamente, candidato à implantação com o ClickOnce porque, por design, não existem mecanismos no ClickOnce para adicionar entradas no registry, instalar assemblies compartilhadas no GAC (Global Assembly Cache), instalar serviços etc.
Confira também
No entanto, se você puder projetar seu aplicativo de modo a não precisar fazer nada especial no momento da instalação, e seu objetivo principal for apresentar uma interface de usuário rica que se comunique com os serviços back-end na rede, então você tem um grande candidato à implantação do ClickOnce. O ClickOnce lhe permite solicitar privilégios de execução de runtime adicionais no momento da instalação por meio de um prompt ao usuário, e você também pode instalar uma licença de confiabilidade a partir de uma autoridade de licença confiável, que permitirá privilégios de runtime elevados sem avisar o usuário. Isso permite que o aplicativo ClickOnce faça operações significativas que excedem o que a política de segurança padrão permitiria, mas não requer um administrador para manipular cada máquina cliente e instalar uma política de segurança personalizada a cada vez que um novo aplicativo for executado. No entanto, assim como acontece com o design do aplicativo, você deve avaliar os requisitos de segurança antes para determinar se o ClickOnce é uma opção adequada.
Os aplicativos implantados com o ClickOnce não têm requisitos de implementação específicos nos cenários mais comuns. Você não precisa escrever nenhum código específico ao ClickOnce, derivá-lo de nenhuma classe base nem implementar nenhuma interface. Os recursos do ClickOnce básico são fornecidos pelo runtime, de modo que o aplicativo cliente não precisa necessariamente tomar conhecimento do ClickOnce. Existem abordagens de programação opcionais para executar atualizações que exijam escrever códigos específicos ao ClickOnce em seu aplicativo, mas isso só será o caso se os recursos de atualização automática do ClickOnce não atenderem aos seus requisitos.
Para que o ClickOnce funcione, é necessário que todas as máquinas clientes tenham o .NET Framework 2.0 instalado. Quando você publica um aplicativo ClickOnce, um bootstrapper setup.exe e os arquivos de suporte também são publicados no servidor, o que permite que você instale facilmente o .NET Framework e quaisquer outros componentes da Microsoft, tais como o MDAC (Microsoft Data Access Components), o Microsoft Installer, o DirectX® etc. No entanto, a instalação desses itens é uma operação privilegiada, que exigirá permissões de administrador. O servidor propriamente dito não tem nenhum requisito específico e pode ser qualquer tipo de servidor Web ou servidor de arquivos.
O ClickOnce é voltado para aplicativos empresariais, como o CRM (Customer Resource Management), aplicativos de gerenciamento pessoal (cartões de ponto, treinamento, pagamento, gerenciamento de benefícios, informações de contato e assim por diante), ou para aplicativos de análise de dados. Esses aplicativos geralmente precisam apresentar uma rica interface interativa ao usuário, mas atuam sobre dados e serviços que são acessados em aplicativos middle-tier, servidores Web ou servidores de bancos de dados. Eles são freqüentemente implantados em ambientes empresariais, nos quais pode haver milhares de estações de trabalho, e a implantação de aplicativos e atualizações para todas essas máquinas costuma ser bastante custosa se um administrador precisar executar uma instalação normal em cada máquina. O ClickOnce também pode ser usado para aplicações consumidoras na Web, tais como aplicativos multimídia, jogos, ferramentas de comunicação e outras formas de aplicativos que não têm muitos requisitos em tempo de instalação, especialmente se esses aplicativos tiverem atualizações disponibilizadas frequentemente.
Aplicativo de exemplo do ClickOnce
A melhor maneira de ter uma idéia do que o ClickOnce pode fazer por você é por meio de um tour experimental, executando as várias implantações e atualizações de um aplicativo de exemplo. O aplicativo de exemplo TimecardManager permite que você digite e visualize entradas de tempo de trabalho em um trabalho ou projeto. Existem provavelmente alguns outros recursos que você pode adicionar ao programa antes de usá-lo no mundo real, mas esse é um bom exemplo de um aplicativo simples que pode ser implantado em um número grande de usuários intranet ou Internet, tanto para uso on-line como off-line. Ao longo deste artigo, evoluirei de um aplicativo “launched”, que simplesmente armazena entradas de tempo em um arquivo local (por meio do armazenamento isolado), a um aplicativo final instalado (“installed”), que armazena entradas em um banco de dados (quando conectado) e executa as atualizações de acordo com o pedido explícito do usuário.
Descreverei algumas das caixas de diálogo que você verá na versão Tech Preview do Visual Studio® 2005 (denominada "Whidbey") para demonstrar o processo básico de publicação e atualização de aplicativos. Lembre-se de que essas UIs provavelmente serão alteradas significativamente para melhor quando o Visual Studio 2005 for lançado, por isso, não fique muito preso a determinados layouts e opções. Concentre-se principalmente no fluxo.
O TimecardManager é um aplicativo Windows Forms simples que consiste em alguns formulários, conforme mostrado na Figura 2. Como mencionei anteriormente, exceto no caso de alguns cenários avançados, você não precisará escrever código para o ClickOnce dentro do aplicativo. Desse modo, nas primeiras versões do aplicativo TimecardManager, não abordarei nenhum tipo de código.
Para publicar esse aplicativo, coloque o executável compilado (bem como os recursos e assemblies de suporte) em uma pasta no servidor Web ou no servidor de arquivos que você usará como servidor de aplicação. Além dos arquivos de aplicativo propriamente ditos, você precisa de um manifesto de aplicativo e de um manifesto de instalação. Os arquivos de manifesto são simplesmente arquivos XML com um esquema (schema) em particular que o CRL (common language runtime) entende e o qual ele usa para determinar o quê instalar e como instalar usando o ClickOnce.
O manifesto do aplicativo (arquivo .manifest) descreve os assemblies e arquivos que compõem o aplicativo e fornece informações sobre a identidade dos assemblies (nome, token de chave pública/hash e localidade), sobre dependências do aplicativo e sobre informações de segurança que afetarão a política de segurança sob a qual o aplicativo será executado. O manifesto de implantação (arquivo .deploy), mostrado na Listagem 1, contém informações de resumo sobre a implantação propriamente dita, tais como: informações sobre a versão, onde encontrar o manifesto do aplicativo e diversas opções referentes ao tipo de implantação e ao comportamento da atualização que será executada.
Após adicionar esse elemento ao elemento de segurança no manifesto e o salvar, você poderá ativar a versão 1.1 do aplicativo, usando o atalho do menu Iniciar que foi criado no momento da instalação. Quando você fizer isso, o aplicativo verificará o servidor de implantação, confirmará se a nova versão (2.0) está disponível e se são necessárias atualizações, e lhe avisará para fazer a atualização. Quando fizer a atualização, será exibida uma caixa de diálogo de instalação um pouco diferente, solicitando a confirmação tanto da instalação como da elevação das permissões. Se você permitir que ela seja instalada, o aplicativo deverá baixar as atualizações e executar a versão 2.0, obtendo as entradas de tempo no banco de dados, em vez de no armazenamento isolado. O aplicativo demo é simples e funciona tanto com armazenamento off-line como on-line, e não tentará sincronizar as duas fontes de dados. No caso de um aplicativo real, você precisaria produzir um design que mesclasse as entradas de tempo armazenadas localmente com aquelas no servidor de banco de dados quando executasse no modo conectado após operações desconectadas.
Nas versões mais recentes do Visual Studio beta, haverá nenhuma maneira alternativa de lidar com permissões elevadas sem que seja necessário avisar o usuário. Em um ambiente intranet, você pode fazer com que um administrador configure uma autoridade de licença de confiança na política de segurança da máquina de cada usuário. Feito isso, é possível implantar a licença de confiança com o ClickOnce para elevar as permissões àquelas exigidas pelo aplicativo, sem que seja necessário avisar o usuário. Basicamente, se a licença de confiança vem de uma autoridade que já é reconhecida como confiável pela máquina do usuário, o mecanismo do ClickOnce é autorizado a elevar as permissões na máquina do usuário com base nas credenciais da autoridade de licença de confiança implantada com o aplicativo.
Atualizações por meio de programação
Os recursos de atualização automática do ClickOnce são bastante flexíveis e podem atender à maioria dos requisitos de atualização do aplicativo. No entanto, pode haver situações em que você deseje amplo controle sobre as atualizações, por exemplo, sobre quando e como efetuá-las. A versão 3.0 do aplicativo de exemplo não usa os recursos de atualização automática do ClickOnce. Em vez disso, ela utiliza a API de programação do ClickOnce para procurar manualmente por atualizações disponíveis e para comandá-las quando necessário. No Technology Preview, as classes que suportam esses recursos residem no namespace System.DeploymentFramework. Nas versões posteriores, elas serão movidas para o System.Deployment. Esse namespace reside em um assembly separado e, desse modo, a versão 3.0 do aplicativo consulta a System.DeploymentFramework.dll para produzir o código para as atualizações. Você pode experimentar o recurso de atualização por solicitação, executando a versão 3.0 do aplicativo TimecardManager e selecionando File | Check for Updates. O código do aplicativo usará a API do ClickOnce para ver se existem atualizações disponíveis no servidor de implantação e, caso haja, ele as baixará.
Além de alterar o modelo de atualização, a versão 3.0 também corrige eventuais bugs que você tenha detectado. Por exemplo, cada vez que você atualizava para uma nova versão, os registros salvos em um armazenamento isolado desapareciam. No .NET 1.x, você só tinha duas opções para usar o armazenamento isolado: isolamento por usuário e assembly, ou isolamento por usuário e domínio.
O armazenamento isolado é a opção mais aconselhada para um aplicativo ClickOnce porque ela evita que você precise de permissões de E/S de arquivos elevadas para muitos cenários e impede que os arquivos de seu aplicativo interfiram com os arquivos de outros aplicativos. Entretanto, os níveis de isolamento disponíveis no .NET 1.x são insuficientes para um cenário ClickOnce porque assim que você aplica uma atualização, o assembly e a identidade de domínio são alterados, o que significa que os arquivos de aplicativo armazenados isoladamente se tornarão órfãos. Como resultado, a versão 2.0 do .NET Framework inclui um novo nível de isolamento: isolamento por usuário e aplicativo. Isso permite que os arquivos armazenados por meio deste nível de isolamento sejam acessados por várias versões do mesmo aplicativo, onde a versão do aplicativo é determinada pelo manifesto do aplicativo, ao contrário do esquema de atribuição de versão de assembly individual normal dos aplicativos baseados em .NET.
Para usar a atualização por programação, você cria um código para a classe ApplicationDeployment (anteriormente denominada ApplicationUpdaterService no Technology Preview). Essa classe expõe vários métodos e propriedades que podem ajudá-lo a determinar se as atualizações estão disponíveis e como aplicá-las. A propriedade estática CurrentDeployment retornará uma instância de ApplicationDeployment que encapsula as informações e a interação com a implantação na máquina cliente. Quando você chamar o método CheckForUpdate, a instalação no servidor será checada em busca de uma atualização. Se houver uma atualização disponível, você poderá obter os novos arquivos juntamente (synchronously) com o método Update, ou individualmente (asynchronously), através de uma API separada. A Listagem 2 mostra o código de atualização sob demanda do aplicativo de exemplo.
private void checkForUpdatesMenuItem_Click(object sender,
System.EventArgs e)
{
ApplicationDeployment updater = ApplicationDeployment.CurrentDeployment;
Version verDepServer = updater.CheckForUpdate();
if (verDepServer != null) // Update available
{
DialogResult res = MessageBox.Show(
"Uma nova versão da aplicação TimecardManager está disponível."
+ " Bvocê deseja atualizar a aplicação agora?",
"TimecardManager Updater", MessageBoxButtons.YesNo);
if (res == DialogResult.Yes)
{
updater.Update();
MessageBox.Show("Por favor feche e restarte a aplicação " +
" para começar a usar a nova versão.");
}
}
}
Com os bits do Technology Preview, uma vez baixada a atualização, você precisará solicitar ao usuário que reinicie o aplicativo para que a nova versão entre em efeito. A atualização é simplesmente descarregada em um conjunto separado de pastas sob o cache do usuário e o atalho do menu Iniciar é atualizado de modo a apontar para aquela versão. Nos próximos builds do Visual Studio 2005, espero que a API do ClickOnce inclua uma maneira de informar o aplicativo de que ele precisa desligar e reinicializar usando a nova versão que acabou de ser descarregada pela API (e dispensar o aviso ao usuário de que este precisa reiniciar manualmente).
A aparência dos novos recursos
Neste artigo, abordei diversos recursos disponíveis no ClickOnce. Alguns desses recursos ainda não estão disponíveis, mas deverão estar no momento em que o Visual Studio 2005 for lançado. Mencionei também as licenças de confiança, que permitirão elevar as permissões nas implantações provenientes de uma fonte confiável, sem necessidade de avisar o usuário. Nos futuros builds do Visual Studio 2005, as assinaturas XML serão aplicadas a todos os manifestos e não será necessário verificar a autenticidade da fonte de implantação nem garantir que os arquivos de aplicativos não foram alterados após a implantação. O Visual Studio 2005 conterá um recurso "Debug in zone" que permite que você ative uma sessão de depuração (debug) em um contexto de segurança especificado de modo a poder depurar o aplicativo com as permissões que ele receberá no ambiente de runtime desejado, por exemplo, Local Intranet ou Internet zones. Ele oferecerá também uma ferramenta de análise de código para determinar exatamente quais permissões são necessárias; com isso, você pode verdadeiramente especificar o conjunto mínimo de permissões exigidas quando implantar com o ClickOnce.
Na próxima versão do Windows, codename "Longhorn", o ClickOnce oferecerá ainda mais melhorias. Para suportar todas as plataformas utilizadas pelo .NET Framework, o ClickOnce no Visual Studio 2005 usa apenas mecanismos de transferência de arquivos simples para baixar os arquivos. No Longhorn, o ClickOnce tirará proveito do BITS (Background Intelligent Transfer Service) para permitir uma atualização de arquivos gradual, menos invasiva ao usuário. Além disso, o contexto de execução no Longhorn será bastante diferente e mais robusto. Permitirá, por exemplo, que os aplicativos sejam alojados em um browser ou executados externamente, e eles rodarão em um ambiente de execução segura (Secure Execution Environment) que oferece proteções ainda melhores do que as disponíveis no runtime do .NET Framework 2.0. Os novos recursos de UI do Longhorn lhe darão um motivo ainda mais convincente para executar um cliente Windows, em vez de um aplicativo baseado em navegador. O ClickOnce tornará isso possível em um ambiente distribuído. Fique de olho em outras melhorias ainda não anunciadas assim que saírem os primeiros feedbacks sobre o ClickOnce.
Conclusão
O ClickOnce fornece uma nova tecnologia de implantação que lhe dá o melhor da experiência de usuário de aplicativo baseado em Windows além de benefícios de manutenção e implantação de aplicativos Web. Ele permite que o usuário baixe e execute um aplicativo rich client na Web, em um compartilhamento de arquivos na rede ou a partir de uma meio local e, mais tarde, executá-lo off-line. Além disso, oferece uma interface de usuário Windows completa na área de trabalho, enquanto permite implantar atualizações e arquivos de aplicativos em um servidor individual. Os aplicativos clientes são automaticamente implantados e atualizados na máquina do usuário (a partir do servidor de implantação) de maneira segura e não afetarão outros aplicativos ou dados já existentes na máquina. Esses aplicativos rodam em um contexto seguro, que pode impedi-los de executar ações danosas em tempo de execução. O ClickOnce oferece diversas opções que proporcionam a arquitetos e designers de aplicativos enorme flexibilidade durante a implantação e execução de cenários e requisitos.
A capacidade e a flexibilidade fornecidas pelo ClickOnce possibilitam o uso de aplicativos cliente Windows em muitos cenários onde os aplicativos baseados em navegador constituem a única opção viável. Recomendo que você analise atentamente os recursos do ClickOnce e considere como ele pode suprir a camada de apresentação de seu aplicativo distribuído quando o Visual Studio 2005 for lançado. Tenho certeza de que você concluirá que o ClickOnce tornará a atualização e a implantação de seus aplicativos mais rápida, suave e amigável ao usuário.