服務的基本資訊
服務是兩個 VSPackage 之間的合約。 一個 VSPackage 提供一組特定的介面供另一個 VSPackage 使用。 Visual Studio 本身是 VSPackage 的集合,可為其他 VSPackage 提供服務。
例如,您可以使用 SVsActivityLog 服務來取得 IVsActivityLog 介面,您可以使用該介面寫入活動記錄。 如需詳細資訊,請參閱如何:使用模組視窗。
Visual Studio 也提供一些未註冊的內建服務。 VSPackage 可以藉由提供服務覆寫來取代內建或其他服務。 任何服務都只允許一個服務覆寫。
服務沒有發現性。 因此,您必須知道您想要使用之服務的服務標別碼 (SID),而且必須知道它所提供的介面。 該服務的參考文件提供了此資訊。
提供服務的 VSPackage 稱為服務提供者。
提供給其他 VSPackage 的服務稱為全域服務。
只有實作它們的 VSPackage 或它建立之任何物件的服務,稱為本機服務。
取代其他套件所提供的內建服務或服務的服務稱為服務覆寫。
服務或服務覆寫會視需要載入,也就是說,當另一個 VSPackage 要求提供服務時,就會載入服務提供者。
若要支援依需求載入,服務提供者向 Visual Studio 註冊其全域服務。 如需詳細資訊,請參閱如何︰提供服務。
取得服務之後,請使用 QueryInterface (非受控程式碼) 或轉型 (受控程式碼) 來取得所需的介面,例如:
受控程式碼會依其類型來參考服務,而非受控程式碼則依其 GUID 參考服務。
當 Visual Studio 載入 VSPackage 時,它會將服務提供者傳遞至 VSPackage,以使 VSPackage 能夠存取全域服務。 這稱為「定位」VSPackage。
VSPackage 可以是所建立物件的服務提供者。 例如,表單可能會將色彩服務的要求傳送至其框架,框架可能會將要求傳遞到 Visual Studio。
最深巢狀或未定位的受控物件可能會呼叫 GetGlobalService 來直接存取全域服務。
使用 GetGlobalService
有時候,您可能需要從尚未定位的工具視窗或控制項容器中取得服務,或是從已定位但不了解您想要的服務之服務提供者中取得服務。 例如,您可能想要從控制項內寫入活動記錄。 如需這些案例和其他案例的詳細資訊,請參閱 如何:針對服務進行疑難排解。
您可以藉由呼叫靜態 GetGlobalService 方法來取得大部分的 Visual Studio 服務。
GetGlobalService 依賴快取服務提供者,該服務提供者會在任何衍生自 Package 的 VSPackage 首次定位時初始化。 您必須確保滿足此條件,否則請為 Null 服務做好準備。
幸運的是,GetGlobalService 在大多數情況下都可以正常運作。
如果 VSPackage 只提供另一個 VSPackage 已知的服務,則請求該服務的 VSPackage 將在載入提供該服務的 VSPackage 之前定位。
如果 VSPackage 建立工具視窗,則 VSPackage 將在建立工具視窗之前定位。
如果控制項容器是由 VSPackage 建立的工具視窗所裝載,則 VSPackage 會在建立控制項容器之前定位。
從工具視窗或控項容器內取得服務
在建構函式、工具視窗或控制項容器中插入此程式碼:
IVsActivityLog log = Package.GetGlobalService(typeof(SVsActivityLog)) as IVsActivityLog; if (log == null) return;
此程式碼會取得 SVsActivityLog 服務,並將其轉換成可用來寫入活動記錄的 IVsActivityLog 介面。 如需範例,請參閱如何︰使用活動記錄。