共用方式為


取得服務

您通常需要取得 Visual Studio 服務才能存取不同的功能。 一般而言,Visual Studio 服務會提供一或多個可供您使用的介面。 您可以從 VSPackage 取得大部分的服務。

任何衍生自 Package 且已正確定位的 VSPackage 都可以要求任何全域服務。 因為 Package 類別會實作 IServiceProvider,因此任何衍生自 Package 的 VSPackage 也是服務提供者。

當 Visual Studio 載入 Package 時,它會在初始化期間將 IServiceProvider 物件傳遞至 SetSite 方法。 這稱為 VSPackage 定位Package 類別會包裝此服務提供者,並提供取得服務的 GetService 方法。

從初始化的 VSPackage 取得服務

  1. 每個 Visual Studio 擴充功能都是從 VSIX 部署專案開始,其中包含擴充功能資產。 建立名為 GetServiceExtension 的 Visual Studio VSIX 專案。 您可以在 [新增專案] 對話方塊中搜尋「vsix」來尋找 VSIX 專案範本。

  2. 現在,新增名為 GetServiceCommand 的自訂命令項目範本。 在 [加入新項目] 對話方塊中,移至 [Visual C#]>[擴充性],然後選取 [自訂命令]。 在視窗底部的 [名稱] 欄位中,將命令檔案名稱變更為 GetServiceCommand.cs。 如需如何建立自訂命令的詳細資訊,請參閱使用功能表命令建立擴充功能

  3. GetServiceCommand.cs 中,移除 MenuItemCommand 方法的主體,並新增下列程式碼:

    IVsActivityLog activityLog = ServiceProvider.GetService(typeof(SVsActivityLog)) as IVsActivityLog;
    if (activityLog == null) return;
    System.Windows.Forms.MessageBox.Show("Found the activity log service.");
    
    

    此程式碼會取得 SVsActivityLog 服務,並將其轉換成可用來寫入活動記錄的 IVsActivityLog 介面。 如需範例,請參閱操作說明︰使用活動記錄

  4. 建置此專案並開始偵錯。 隨即出現實驗執行個體。

  5. 在實驗執行個體的 [工具] 功能表上,尋找 [叫用 GetServiceCommand] 按鈕。 當您按一下此按鈕時,應該會看到一個訊息方塊,指出 [找到活動記錄服務。]

從工具視窗或控制項容器取得服務

有時候,您可能需要從尚未定位的工具視窗或控制項容器中取得服務,或是從已定位但不了解您想要的服務之服務提供者中取得服務。 例如,您可能想要從控制項內寫入活動記錄。

靜態 GetGlobalService 方法依賴快取服務提供者,該服務提供者會在任何衍生自 Package 的 VSPackage 首次定位時初始化。

因為 VSPackage 建構函式是在 VSPackage 定位之前呼叫的,因此全域服務通常無法在 VSPackage 建構函式內使用。 請參閱操作說明:針對服務進行疑難排解以取得因應措施。

以下是在工具視窗或其他非 VSPackage 元素中取得服務的方式範例。

IVsActivityLog log = Package.GetGlobalService(typeof(SVsActivityLog)) as IVsActivityLog;
if (log == null) return;

從 DTE 物件取得服務

您也可以從 DTEClass 物件取得服務。 不過,您必須從 VSPackage 或呼叫靜態 GetGlobalService 方法,以服務的形式取得 DTE 物件。

DTE 物件會實作 IServiceProvider,您可以使用 GetService 來查詢服務。

以下說明如何從 DTE 物件取得服務。

// Start with the DTE object, for example: 
// using EnvDTE;
// DTE dte = (DTE)GetService(typeof(DTE));

ServiceProvider sp = new ServiceProvider((Microsoft.VisualStudio.OLE.Interop.IServiceProvider)dte);
if (sp != null)
{
    IVsActivityLog log = sp.GetService(typeof(SVsActivityLog)) as IVsActivityLog;
    if (log != null)
    {
        System.Windows.Forms.MessageBox.Show("Found the activity log service.");
    }
}