Lidar com a implantação especializada
Uma implantação é uma operação opcional para projetos. Um projeto da Web, por exemplo, oferece suporte a uma implantação para permitir que um projeto atualize um servidor Web. Da mesma forma, um projeto de dispositivo inteligente oferece suporte a uma implantação para copiar um aplicativo criado para o dispositivo de destino. Os subtipos de projeto podem fornecer comportamento de implantação especializado implementando a IVsDeployableProjectCfg interface. Essa interface define um conjunto completo das operações de implantação:
-
A operação de implantação real deve ser executada no thread separado para tornar o Visual Studio ainda mais responsivo à interação do usuário. Os métodos fornecidos por IVsDeployableProjectCfg são chamados de forma assíncrona pelo Visual Studio e operam em segundo plano, permitindo que o ambiente consulte o status de uma operação de implantação a qualquer momento ou interrompa a operação, se necessário. As IVsDeployableProjectCfg operações de implantação de interface são chamadas pelo ambiente quando o usuário seleciona o comando deploy.
Para notificar o ambiente de que uma operação de implantação começou ou terminou, o subtipo de projeto precisa chamar os OnStartDeploy métodos e .OnEndDeploy
Para manipular uma implantação especializada por um projeto de subtipo
Implemente o método para registrar o AdviseDeployStatusCallback ambiente para receber notificações de eventos de status de implantação.
private Microsoft.VisualStudio.Shell.EventSinkCollection adviseSink = new Microsoft.VisualStudio.Shell.EventSinkCollection(); public int AdviseDeployStatusCallback(IVsDeployStatusCallback pIVsDeployStatusCallback, out uint pdwCookie) { if (pIVsDeployStatusCallback == null) throw new ArgumentNullException("pIVsDeployStatusCallback"); pdwCookie = adviseSink.Add(pIVsDeployStatusCallback); return VSConstants.S_OK; }
Implemente o método para cancelar o UnadviseDeployStatusCallback registro do ambiente para receber notificações de eventos de status de implantação.
Implemente o Commit método para executar a operação de confirmação específica para seu aplicativo. Esse método é usado principalmente para implantação de banco de dados.
Implemente o Rollback método para executar uma operação de reversão. Quando esse método é chamado, o projeto de implantação deve fazer o que for apropriado para reverter as alterações e restaurar o estado do projeto. Esse método é usado principalmente para implantação de banco de dados.
Implemente o QueryStartDeploy método para determinar se um projeto é ou não capaz de iniciar uma operação de implantação.
public int QueryStartDeploy(uint dwOptions, int[] pfSupported, int[] pfReady) { if (pfSupported != null && pfSupported.Length >0) pfSupported[0] = 1; if (pfReady != null && pfReady.Length >0) { pfReady[0] = 0; if (deploymentThread != null && !deploymentThread.IsAlive) pfReady[0] = 1; } return VSConstants.S_OK; }
Implemente o QueryStatusDeploy método para determinar se uma operação de implantação foi concluída com êxito ou não.
Implemente o StartDeploy método para iniciar uma operação de implantação em um thread separado. Coloque o código específico para a implantação do aplicativo dentro do
Deploy
método.public int StartDeploy(IVsOutputWindowPane pIVsOutputWindowPane, uint dwOptions) { if (pIVsOutputWindowPane == null) throw new ArgumentNullException("pIVsOutputWindowPane"); if (deploymentThread != null && deploymentThread.IsAlive) throw new NotSupportedException("Cannot start deployment operation when it is already started; Call QueryStartDeploy first"); outputWindow = pIVsOutputWindowPane; // Notify that deployment is about to begin and see if any user wants to cancel. if (!NotifyStart()) return VSConstants.E_ABORT; operationCanceled = false; // Create and start our thread deploymentThread = new Thread(new ThreadStart(this.Deploy)); deploymentThread.Name = "Deployment Thread"; deploymentThread.Start(); return VSConstants.S_OK; }
Implemente o StopDeploy método para interromper uma operação de implantação. Esse método é chamado quando um usuário pressiona o botão Cancelar durante o processo de implantação.
public int StopDeploy(int fSync) { if (deploymentThread != null && deploymentThread.IsAlive) return VSConstants.S_OK; outputWindow.OutputStringThreadSafe("Canceling deployment"); operationCanceled = true; if (fSync != 0) { // Synchronous request, wait for the thread to terminate. if (!deploymentThread.Join(10000)) { Debug.Fail("Deployment thread did not terminate before the timeout, Aborting thread"); deploymentThread.Abort(); } } return VSConstants.S_OK; }
Observação
Todos os exemplos de código fornecidos neste tópico são partes de um exemplo maior em exemplos VSSDK.