VisualStudio.Extensibility 擴充功能的元件

使用 VisualStudio.Extensibility 的擴充功能,通常會有數個彼此互動以及和 Visual Studio 互動的元件。

擴充執行個體

擴充功能必須擁有衍生自 Extension 的類別。 如需範例實作,請參閱 MarkdownLinter

Extension 類別的執行個體是擴充功能執行的起點。 此執行個體包含 Visual Studio 查詢擴充功能所提供之服務所需的方法。 它也提供擴充功能的虛擬方法,提供在擴充功能元件之間共用的當地語系化資源和擴充功能擁有的本機服務。

Extension 類別的設定也包含擴充功能的中繼資料,此中繼資料會顯示在 Visual Studio 管理擴充功能視窗中,以及 Visual Studio Marketplace 上已發佈的擴充功能。

[VisualStudioContribution]
public class MarkdownLinterExtension : Extension
{
    /// <inheritdoc/>
    public override ExtensionConfiguration ExtensionConfiguration => new()
    {
        Metadata = new(
                id: "MarkdownLinter.0cf26ba2-edd5-4419-8646-a55d0a83f7d8",
                version: this.ExtensionAssemblyVersion,
                publisherName: "Microsoft",
                displayName: "Markdown Linter Sample Extension",
                description: "Sample markdown linter extension"),
    };
    ...

對於熟悉現有 VS SDK API 的擴充功能開發人員,包含在 ExtensionConfigurationMetadata 的會使用來產生 .vsixmanifest 檔案。 此外,Extension 類別類似於 VS SDK 擴充性模型中所使用的 AsyncPackage 類別。

VisualStudioExtensibility 物件

物件 VisualStudioExtensibility 可作為 Visual Studio 所公開擴充性功能的進入點。 此類別有多種擴充方法、屬性,可快速列舉擴充性 SDK 中的可用功能。 如需可用方法,請參閱 API 文件。

擴充功能組件

如果是擴充功能將元件貢獻至 Visual Studio 的功能 (例如:命令、編輯器接聽程式),擴充功能會利用屬性化類別。 建置程序會產生正確的中繼資料,以確保 Visual Studio 可以探索這些元件。

如果是擴充功能將元件貢獻至 Visual Studio 的功能 (例如:命令、編輯器接聽程式,工具視窗等),擴充功能會利用標記 VisualStudioContribution 屬性的類別。 建置程序會產生正確的中繼資料,以確保 Visual Studio 可以探索這些元件。

SDK 目前支援一組有限的元件,可供貢獻:

這些使用相依性插入程式庫建立之類別的執行個體,是由 SDK 提供之擴展性框架的一部分,而且可以使用建構函數來擷取 SDK 或擴充功能本身提供的服務的執行個體,以在元件之間共用狀態

擴充功能組件的存留期

每個組件的存留期是由在 Visual Studio IDE 程序內載入這些組件的個別元件所管理。

  • 命令處理常式在啟動對應的命令集時初始化,這可能發生在命令首次執行期間。 命令處理常式一旦啟動後,只有在 IDE 關閉時才能處置。

  • 同樣地,當 IDE 中載入符合指定內容類型的第一個文字檢視時,將會初始化文字檢視接聽程式。 目前,這類接聽程式會處於作用中狀態直到 IDE 關閉,但此行為未來可能會變更。

一般而言,如果是複雜的擴充功能,我們建議其提供本機服務,讓組件可以在其建構函式中匯入,並使用這些服務在相同組件的執行個體之間共用狀態。 這種做法可確保擴充功能狀態不會受到擴充組件存留期變更的影響。

SDK 提供的插入服務

SDK 提供下列服務,可用於任何擴充組件的建構函式:

  • VisualStudioExtensibility:每個擴充組件都可以插入 VisualStudioExtensibility 的實例,以與 Visual Studio IDE 互動。

  • Extension:組件可以將 Microsoft.VisualStudio.Extensibility.Extension 類型或從其繼承的擴充自己的類型,插入到擴充組件中。

  • TraceSource:根據需要為每個擴充功能建立一個追蹤來源執行個體,可用於記錄診斷資訊。 這些執行個體已向 Visual Studio 診斷提供者註冊,可用於合併來自多個服務的記錄並利用未來的工具來存取即時記錄。 請參閱記錄

  • 本機服務:擴充功能本身所提供的任何本機服務,也適用於相依性插入。

  • MefInjection<TService>AsyncServiceProviderInjection<TService, TInterface>:同處理序擴充功能可以插入傳統上透過 MEFAsyncServiceProvider 取用的 Visual Studio SDK 服務。

本機擴充服務

在某些情況下,擴充功能可能會想要在不同元件之間共用狀態,例如命令處理常式和文字檢視變更接聽程式,如範例 MarkdownLinter 所示。 可以透過覆寫 Extension.InitializeServices 方法將這些服務新增至同處理序服務集合,並且在建立擴充組件的執行個體時,將根據建構函式引數插入服務。

新增服務有三個選項:

  • AddTransient:每個擷取該服務的組件,都會建立一個新的服務執行個體。
  • AddScoped:服務的新執行個體會在特定範圍內建立。 在 Visual Studio 擴充性的內容中,範圍是指單一擴充組件。
  • AddSingleton:第一次擷取時會建立單一共用服務執行個體。

由於 VisualStudioExtensibility 物件的存留期被繫結到單一擴充組件的範圍,因此擷取它的任何本機服務,都必須是有範圍的或暫時性服務。 嘗試建立插入 VisualStudioExtensibility 的單一服務將導致失敗。

如需如何使用本機服務的範例,請參閱 MarkdownLinter 擴充功能

用戶端內容

由於新 SDK 中的所有擴充功能都執行跨處理序,因此我們會介紹各種擴充組件的用戶端內容概念,以表示叫用事件或方法時 IDE 的狀態。 此內容是由 SDK 中的 IClientContext 執行個體表示,並且會傳入各種作業,例如命令執行處理常式。 SDK 在 IClientContext上提供了可用於從內容中檢索物件的擴充方法。 例如,擴充功能可以在使用 IClientContext 執行個體的命令執行時,取得所選項目的使用中文字檢視或 URI。

某些元件,例如命令,也可讓您宣告其感興趣的內容。 這樣做是為了最佳化每個遠端執行中傳輸的資料量,因為用戶端內容未來可能會很大。 在初始預覽中,只有兩個可用的內容:ShellEditor,而且在使用 CommandAttribute 宣告命令時,預設會包含這兩者。