Обработка специализированного развертывания
Развертывание является необязательной операцией для проектов. Например, веб-проект поддерживает развертывание, чтобы разрешить проекту обновлять веб-сервер. Аналогичным образом, проект Smart Device поддерживает развертывание для копирования встроенного приложения на целевое устройство. Подтипы проекта могут предоставлять специализированное поведение развертывания, реализуя IVsDeployableProjectCfg интерфейс. Этот интерфейс определяет полный набор операций развертывания:
-
Фактическая операция развертывания должна выполняться в отдельном потоке, чтобы Сделать 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 Реализуйте метод, чтобы отменить регистрацию среды для получения уведомлений о событиях состояния развертывания.
Commit Реализуйте метод для выполнения операции фиксации, конкретной для приложения. Этот метод используется главным образом для развертывания базы данных.
Rollback Реализуйте метод для выполнения операции отката. При вызове этого метода проект развертывания должен выполнять все действия, необходимые для отката изменений и восстановления состояния проекта. Этот метод используется главным образом для развертывания базы данных.
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 Реализуйте метод, чтобы определить, успешно ли выполнена операция развертывания.
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.