共用方式為


管理解決方案中的專案載入

Visual Studio 解決方案可以包含大量的專案。 預設的 Visual Studio 行為是在開啟解決方案時載入解決方案中的所有專案,而且在完成載入之前,不允許使用者存取任何專案。 當專案載入程序持續兩分鐘以上時,會顯示進度列,其中顯示已載入的專案數和專案總數。 使用者在使用多個專案使用解決方案時可以卸載專案,但此程序有一些缺點:卸載的專案不會建置為重建解決方案命令的一部分,也不會顯示關閉專案的類型和成員的 IntelliSense 描述。

開發人員可以藉由建立解決方案載入管理員來減少解決方案載入時間及管理專案載入行為。 解決方案載入管理員可以先確定專案已載入,再啟動背景建置、延遲背景載入,直到其他背景工作完成為止,以及執行其他專案載入管理工作。

建立解決方案載入管理員

開發人員可以藉由實作 IVsSolutionLoadManager 並建議載入管理員啟用中的 Visual Studio 解決方案,以建立解決方案載入管理員。

啟用解決方案載入管理員

Visual Studio 一次只允許一個解決方案載入管理員,因此當您想要啟用解決方案載入管理員時,您必須建議採用 Visual Studio。 如果稍後啟用第二個解決方案載入管理員,您的解決方案載入管理員會中斷連線。

您必須取得 SVsSolution 服務並設定 __VSPROPID4.VSPROPID_ActiveSolutionLoadManager 屬性:

IVsSolution pSolution = GetService(typeof(SVsSolution)) as IVsSolution;
object objLoadMgr = this;   //the class that implements IVsSolutionManager
pSolution.SetProperty((int)__VSPROPID4.VSPROPID_ActiveSolutionLoadManager, objLoadMgr);

當 Visual Studio 正在關閉,或當不同的套件透過呼叫 SetProperty__VSPROPID4.VSPROPID_ActiveSolutionLoadManager 屬性時,就會呼叫 OnDisconnect 方法。

不同類型解決方案載入管理員的策略

您可以根據需管理的解決方案類型,以不同的方式實作解決方案載入管理員。

如果解決方案載入管理員一般是用來管理方案載入,可以將惠實作為 VSPackage 的一部分。 在 VSPackage 上新增 ProvideAutoLoadAttribute (值為 SolutionOpening_guid) ,應該將套件設定為自動載入。 接著可以在 Initialize 方法中 啟動解決方案載入管理員。

注意

如需自動載入套件的詳細資訊,請參閱載入 VSPackages

由於 Visual Studio 只會辨識要啟用的最後一個解決方案載入管理員,因此一般解決方案載入管理員應該一律偵測是否有現有的載入管理員後,再自行啟動。 如果在解決方案服務上呼叫 GetProperty()__VSPROPID4.VSPROPID_ActiveSolutionLoadManager 傳回 null,則沒有作用中的解決方案載入管理員。 如果未傳回 Null,請檢查物件是否與您的解決方案載入管理員相同。

如果解決方案載入管理員只打算管理少數類型的解決方案,VSPackage 可以訂閱解決方案載入事件 (藉由呼叫 AdviseSolutionEvents),並使用 OnBeforeOpenSolution 的事件處理常式來啟用解決方案載入管理員。

如果解決方案載入管理員只打算管理特定解決方案,則可以呼叫 WriteSolutionProps 的解決方案前段,將啟用資訊持續保存為解決方案檔案的一部分。

特定解決方案載入管理員應該在 OnAfterCloseSolution 事件處理常式中自行停用,以免與其他解決方案載入管理員發生衝突。

如果您需要解決方案載入管理員只持續保存全域專案載入屬性 (例如,在 [選項] 頁面上設定屬性),您可以在 OnAfterOpenProject 事件處理常式中啟用解決方案載入管理員,在解決方案屬性中保存設定,然後停用解決方案載入管理員。

處理解決方案載入事件

若要訂閱解決方案載入事件,請在啟用解決方案載入管理員時呼叫 AdviseSolutionEvents。 如果實作 IVsSolutionLoadEvents,您可以回應與不同專案載入屬性相關的事件。

  • OnBeforeOpenSolution:開啟解決方案之前,會引發此事件。

  • OnBeforeBackgroundSolutionLoadBegins:此事件會在解決方案完全載入之後,但在背景專案載入作業再次開始之前引發。

  • OnAfterBackgroundSolutionLoadComplete:此事件會在解決方案一開始完全載入後引發,不論是否有解決方案載入管理員。 每當解決方案完全載入時,也會在背景載入或需求載入後引發。 同時,SolutionExistsAndFullyLoaded_guid 會重新啟用。

  • OnQueryBackgroundLoadProjectBatch:在載入專案之前會引發此事件。 為了確保在載入專案之前完成其他背景程序,請將 pfShouldDelayLoadToNextIdle 設定為 true

  • OnBeforeLoadProjectBatch:當將要載入一批專案時,就會引發此事件。 如果 fIsBackgroundIdleBatch 為 true,則會在背景中載入專案;如果 fIsBackgroundIdleBatch 為 false,則專案會因為使用者要求而以同步方式載入,例如當使用者在方案總管中展開擱置的專案。 您可以處理此事件以執行昂貴的工作,否則必須在 OnAfterOpenProject 中完成。

  • OnAfterLoadProjectBatch:載入一批項目後就會引發此事件。

偵測及管理解決方案和專案載入

若要偵測專案和解決方案的載入狀態,請使用下列值呼叫 GetProperty

您也可以呼叫下列其中一種方法,確保專案和解決方案已載入: