Depurar aplicativos ClickOnce que usam System.Deployment.Application

No Visual Studio, a implantação do ClickOnce permite que você configure como um aplicativo deve ser atualizado. No entanto, se você precisar usar e personalizar recursos avançados de implantação do ClickOnce, terá que acessar o modelo de objeto de implantação fornecido por System.Deployment.Application. Você pode usar as APIs System.Deployment.Application em tarefas avançadas, por exemplo:

  • Criação de uma opção "Atualizar Agora" em seu aplicativo

  • Downloads condicionais sob demanda de vários componentes do aplicativo

  • Atualizações integradas diretamente no aplicativo

  • Garantia de que o aplicativo cliente esteja sempre atualizado

    Como as APIs System.Deployment.Application funcionam somente quando um aplicativo é implantado com a tecnologia ClickOnce, a única maneira de depurá-las é implantar o aplicativo usando ClickOnce, anexá-lo e depurá-lo. Pode ser difícil anexar o depurador cedo o suficiente, pois esse código geralmente é executado quando o aplicativo é iniciado e é executado antes que você possa anexar o depurador. Uma solução é colocar quebras (ou interrupções, em projetos do Visual Basic) antes do código de verificação de atualização ou do código sob demanda.

    A técnica de depuração recomendada é a seguinte:

Observação

A classe ApplicationDeployment e as APIs no namespace System.Deployment.Application não têm suporte no .NET Core e no .NET 5 e versões posteriores. No .NET 7, há suporte para um novo método de acesso às propriedades de implantação de aplicativos. Para obter mais informações, consulte Acessar propriedades de implantação do ClickOnce no .NET. O .NET 7 não oferece suporte ao equivalente aos métodos ApplicationDeployment.

  1. Antes de começar, verifique se os arquivos de símbolo (.pdb) e os arquivos de origem estão arquivados.

  2. Implante a versão 1 do aplicativo.

  3. Crie uma solução em branco. No menu Arquivo, clique em Novo e, em seguida em Projeto. Na caixa de diálogo Novo Projeto, abra o nó Outros Tipos de Projeto e selecione a pasta Soluções do Visual Studio. No painel Modelos, selecione Solução em Branco.

  4. Adicione o local de origem arquivado às propriedades dessa nova solução. No Gerenciador de Soluções, clique com o botão direito do mouse no nó da solução e clique em Propriedades. Na caixa de diálogo Páginas de Propriedades, selecione Depurar Arquivos de Origem e adicione o diretório do código-fonte arquivado. Caso contrário, o depurador encontrará os arquivos de origem desatualizados, já que os caminhos do arquivo de origem são registrados no arquivo .pdb. Se o depurador usar arquivos de origem desatualizados, você verá uma mensagem informando que a origem não corresponde.

  5. Verifique se o depurador pode encontrar os arquivos .pdb. Se você os implantou com seu aplicativo, o depurador os encontrará automaticamente. Ele sempre olha em seguida para o assembly em questão primeiro. Caso contrário, você precisará adicionar o caminho de arquivo morto aos locais do arquivo de símbolo (.pdb) (para acessar essa opção, no menu Ferramentas , clique em Opções , abra o nó Depuração e clique em Símbolos ).

  6. Depure o que acontece entre as chamadas de método CheckForUpdate e Download/Update.

    Por exemplo, o código de atualização pode ser o seguinte:

        Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
            If My.Application.Deployment.IsNetworkDeployed Then
    
                If (My.Application.Deployment.CheckForUpdate()) Then
    
                    My.Application.Deployment.Update()
                    Application.Restart()
    
                End If
    
            End If
        End Sub
    
  7. Implante a versão 2.

  8. Tente anexar o depurador ao aplicativo versão 1 enquanto ele baixa uma atualização para a versão 2. Como alternativa, você pode usar o método System.Diagnostics.Debugger.Break ou simplesmente Stop no Visual Basic. É claro que você não deve deixar essas chamadas de método no código de produção.

    Por exemplo, digamos que você esteja desenvolvendo um aplicativo do Windows Forms e tenha um manipulador de eventos para esse método com a lógica de atualização nele. Para depurar isso, basta anexar antes que o botão seja pressionado e, em seguida, definir um ponto de interrupção (abra o arquivo de arquivo morto apropriado e defina o ponto de interrupção lá).

    Use a propriedade IsNetworkDeployed para invocar as APIs System.Deployment.Application somente quando o aplicativo for implantado; as APIs não devem ser invocadas durante a depuração no Visual Studio.