Obsługa wyspecjalizowanego wdrożenia
Wdrożenie jest opcjonalną operacją dla projektów. Na przykład projekt internetowy obsługuje wdrożenie, aby umożliwić aktualizacji projektu serwera sieci Web. Podobnie projekt urządzenia inteligentnego obsługuje wdrożenie w celu skopiowania wbudowanej aplikacji na urządzenie docelowe. Podtypy projektu mogą dostarczać wyspecjalizowane zachowanie wdrożenia przez zaimplementowanie interfejsu IVsDeployableProjectCfg . Ten interfejs definiuje kompletny zestaw operacji wdrażania:
-
Rzeczywista operacja wdrażania powinna być wykonywana w osobnym wątku, aby program Visual Studio był jeszcze bardziej dynamiczny na interakcję użytkownika. Metody udostępniane przez IVsDeployableProjectCfg program są wywoływane asynchronicznie przez program Visual Studio i działają w tle, umożliwiając środowisku wykonywanie zapytań o stan operacji wdrażania w dowolnym momencie lub zatrzymywanie operacji, jeśli jest to konieczne. IVsDeployableProjectCfg Operacje wdrażania interfejsu są wywoływane przez środowisko, gdy użytkownik wybierze polecenie deploy.
Aby powiadomić środowisko o rozpoczęciu lub zakończeniu operacji wdrażania, podtyp projektu musi wywołać OnStartDeploy metody i OnEndDeploy .
Aby obsłużyć wyspecjalizowane wdrożenie według projektu podrzędnego
Zaimplementuj metodę rejestrowania AdviseDeployStatusCallback środowiska w celu odbierania powiadomień o zdarzeniach stanu wdrożenia.
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; }
Zaimplementuj metodę UnadviseDeployStatusCallback , aby anulować rejestrację środowiska w celu otrzymywania powiadomień o zdarzeniach stanu wdrożenia.
Zaimplementuj metodę Commit , aby wykonać operację zatwierdzania specyficzną dla aplikacji. Ta metoda jest używana głównie na potrzeby wdrażania bazy danych.
Zaimplementuj metodę , Rollback aby wykonać operację wycofywania. Po wywołaniu tej metody projekt wdrożenia musi wykonać odpowiednie czynności, aby wycofać zmiany i przywrócić stan projektu. Ta metoda jest używana głównie na potrzeby wdrażania bazy danych.
Zaimplementuj metodę, QueryStartDeploy aby określić, czy projekt może rozpocząć operację wdrażania.
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; }
Zaimplementuj metodę, QueryStatusDeploy aby określić, czy operacja wdrażania została ukończona pomyślnie.
Zaimplementuj metodę , StartDeploy aby rozpocząć operację wdrażania w osobnym wątku. Umieść kod specyficzny dla wdrożenia aplikacji wewnątrz
Deploy
metody .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; }
Zaimplementuj metodę , StopDeploy aby zatrzymać operację wdrażania. Ta metoda jest wywoływana, gdy użytkownik naciska przycisk Anuluj podczas procesu wdrażania.
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; }
Uwaga
Wszystkie przykłady kodu podane w tym temacie są częścią większego przykładu w przykładach zestawu VSSDK.