共用方式為


服務的基本資訊

服務是兩個 VSPackage 之間的合約。 一個 VSPackage 提供一組特定的介面供另一個 VSPackage 使用。 Visual Studio 本身是 VSPackage 的集合,可為其他 VSPackage 提供服務。

例如,您可以使用 SVsActivityLog 服務來取得 IVsActivityLog 介面,您可以使用該介面寫入活動記錄。 如需詳細資訊,請參閱如何:使用模組視窗

Visual Studio 也提供一些未註冊的內建服務。 VSPackage 可以藉由提供服務覆寫來取代內建或其他服務。 任何服務都只允許一個服務覆寫。

服務沒有發現性。 因此,您必須知道您想要使用之服務的服務標別碼 (SID),而且必須知道它所提供的介面。 該服務的參考文件提供了此資訊。

  • 提供服務的 VSPackage 稱為服務提供者。

  • 提供給其他 VSPackage 的服務稱為全域服務。

  • 只有實作它們的 VSPackage 或它建立之任何物件的服務,稱為本機服務。

  • 取代其他套件所提供的內建服務或服務的服務稱為服務覆寫。

  • 服務或服務覆寫會視需要載入,也就是說,當另一個 VSPackage 要求提供服務時,就會載入服務提供者。

  • 若要支援依需求載入,服務提供者向 Visual Studio 註冊其全域服務。 如需詳細資訊,請參閱如何︰提供服務

  • 取得服務之後,請使用 QueryInterface (非受控程式碼) 或轉型 (受控程式碼) 來取得所需的介面,例如:

    GetService(typeof(SVsActivityLog)) as IVsActivityLog;
    
  • 受控程式碼會依其類型來參考服務,而非受控程式碼則依其 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 介面。 如需範例,請參閱如何︰使用活動記錄