次の方法で共有


特別な配置を処理する

配置は、プロジェクトのオプションの操作です。 たとえば、Web プロジェクトでサポートされる配置では、プロジェクトによって Web サーバーを更新できます。 同様に、スマート デバイス プロジェクトでは、ビルドされたアプリケーションをターゲット デバイスにコピーする配置がサポートされます。 プロジェクト サブタイプでは、IVsDeployableProjectCfg インターフェイスを実装して特別な配置動作を提供できます。 このインターフェイスによって、配置操作の完全なセットが定義されます。

  • AdviseDeployStatusCallback

  • Commit

  • QueryStartDeploy

  • QueryStatusDeploy

  • Rollback

  • StartDeploy

  • StopDeploy

  • UnadviseDeployStatusCallback

    ユーザーの操作に対する Visual Studio の応答性をさらに高めるために、実際の配置操作は別のスレッドで実行する必要があります。 IVsDeployableProjectCfg によって提供されるメソッドは、Visual Studio から非同期で呼び出され、バックグラウンドで動作するため、環境で配置操作の状態をいつでもクエリでき、必要な場合には操作を停止できます。 IVsDeployableProjectCfg インターフェイスの配置操作は、ユーザーが配置コマンドを選択したときに環境によって呼び出されます。

    配置操作が開始または終了したことを環境に通知するために、プロジェクト サブタイプは OnStartDeploy メソッドや OnEndDeploy メソッドを呼び出す必要があります。

サブタイプ プロジェクトによって特別な配置を処理するには

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

Note

このトピックで取り上げるすべてのコード例は、VSSDK サンプルの大きな例の一部です。