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.
Antes de começar, verifique se os arquivos de símbolo (.pdb) e os arquivos de origem estão arquivados.
Implante a versão 1 do aplicativo.
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.
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.
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 ).
Depure o que acontece entre as chamadas de método
CheckForUpdate
eDownload
/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
Implante a versão 2.
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 simplesmenteStop
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.