共用方式為


處理特製化的部署

部署是專案的選擇性作業。 例如,Web 專案支援部署,讓專案更新 Web 伺服器。 同樣地,智慧型裝置專案支援將建置的應用程式複製到目標裝置的部署。 專案子類型可以藉由實作 IVsDeployableProjectCfg 介面來提供特製化部署行為。 此介面定義一組完整的部署作業:

由子類型專案處理特製化部署

  • 實作 AdviseDeployStatusCallback 方法來註冊環境,以接收部署狀態事件的通知。

    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;
    }
    
    
  • 實作 UnadviseDeployStatusCallback 方法來取消環境註冊,以接收部署狀態事件的通知。

    public int UnadviseDeployStatusCallback(uint dwCookie)
    {
        adviseSink.RemoveAt(dwCookie);
        return VSConstants.S_OK;
    }
    
    
  • 實作 Commit 方法,以執行應用程式專屬的認可作業。 此方法主要用於資料庫部署。

    public int Commit(uint dwReserved)
    {
         //Implement commit operation here.
         return VSConstants.S_OK;
    }
    
    
  • 實作 Rollback 方法來執行復原作業。 呼叫此方法時,部署專案必須執行任何適當的動作,才能復原變更並還原專案的狀態。 此方法主要用於資料庫部署。

    public int Rollback(uint dwReserved)
    {
        //Implement Rollback operation here.
        return VSConstants.S_OK;
    }
    
    
  • 實作 QueryStartDeploy 方法來判斷專案是否能夠啟動部署作業。

    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;
    }
    
    
  • 實作 QueryStatusDeploy 方法來判斷部署作業是否已順利完成。

    public int QueryStatusDeploy(out int pfDeployDone)
    {
        pfDeployDone = 1;
        if (deploymentThread != null && deploymentThread.IsAlive)
            pfDeployDone = 0;
        return VSConstants.S_OK;
    }
    
    
  • 實作 StartDeploy 方法,以在不同執行緒中開始部署作業。 將應用程式部署的特定程式碼放在 Deploy 方法中。

    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;
    }
    
    
  • 實作 StopDeploy 方法來停止部署作業。 當使用者在部署流程期間按下 [取消] 按鈕時,就會呼叫這個方法。

    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;
    }
    
    

注意

本主題中提供的所有程式碼範例都是 VSSDK 範例中較大範例的一部分。