建立你的第一個 Visual Studio 擴充功能

這份文件是一個快速入門文件,說明如何使用 VisualStudio.Extensibility 建立你的第一個擴充功能。 此擴充功能是在處理序外執行,也就是說,它是在 Visual Studio 處理序之外執行。

Prerequisites

  • Visual Studio 2022 17.9 版預覽版 1 或更新版本,搭配 Visual Studio extension development 工作負載。

建立延伸專案

  • 使用 VisualStudio.Extensibility Project 範本建立新的擴充功能專案。

VSExtensibility 範本的截圖。

此時,你已準備好開始擴充 Visual Studio 的功能,將命令和編輯器元件新增至你的擴充功能。

Extension 類別

該範本建立一個擴展 Extension的類別。 這個類別是載入擴充功能時第一個實例化的類別。 在 InitializeServices 方法中,您可以將自己的服務新增至服務集合中,使其可供相依性注入使用。

[VisualStudioContribution]
internal class ExtensionEntrypoint : Extension
{
    protected override void InitializeServices(IServiceCollection serviceCollection)
    {
        base.InitializeServices(serviceCollection);

        // You can configure dependency injection here by adding services to the serviceCollection.
    }
}

你也可以看到 VisualStudioContribution 屬性,用來標記要被 Visual Studio 消耗的擴充元件。 此屬性可套用於實作 IVisualStudioContributionClass 類別或實作 IVisualStudioContributionProperty型別的靜態屬性。

新增你的第一個指令

範本會建立 Command1.cs 作為你的第一個指令處理常式,你可以將它作為起點。 由於我們想讓Visual Studio知道這個指令,而 Command 類別實作了 IVisualStudioContributionClass,因此該指令被標記為 VisualStudioContribution 屬性。

[VisualStudioContribution]
internal class Command1 : Command
{

該指令有一個名為 CommandConfiguration的設定屬性,定義其顯示名稱、圖示及選單中 Extensions 的位置。

    public override CommandConfiguration CommandConfiguration => new("%MyExtension.Command1.DisplayName%")
    {
        // Use this object initializer to set optional parameters for the command. The required parameter,
        // displayName, is set above. DisplayName is localized and references an entry in .vsextension\string-resources.json.
        Icon = new(ImageMoniker.KnownValues.Extension, IconSettings.IconAndText),
        Placements = new[] { CommandPlacement.KnownPlacements.ExtensionsMenu },
    };

配置屬性會在建構擴充套件時由 C# 編譯器評估,其值會儲存為擴充套件的元資料,讓 Visual Studio 能讀取這些屬性而無需載入擴充套件組件。 因此,配置屬性相較於一般屬性有額外的限制(例如必須是唯讀的)。

你可以看到指令的顯示名稱是 "%MyExtension.Command1.DisplayName%",它參考 MyExtension.Command1.DisplayName 了檔案中的 .vsextension/string-resources.json 字串,讓這個字串能夠被本地化。

當指令執行時,Visual Studio 會呼叫 ExecuteCommandAsync 方法,你可以在該方法中設定中斷點。 你可以使用 context 參數或 this.Extensibility 物件來與Visual Studio互動。

例如,指令處理常式可以如下:

public override async Task ExecuteCommandAsync(IClientContext context, CancellationToken cancellationToken)
{
    await context.ShowPromptAsync(
        "Hello from an extension!", 
        PromptOptions.OK, 
        cancellationToken);
}

如需更多關於如何新增指令的資訊,請參閱 指令章 節。

偵錯您的擴充套件

  1. 請確保你的擴充專案在 Visual Studio 中被選為啟動專案,並按 F5 開始除錯。

  2. 按下 F5 會建立你的擴充套件,並將其部署到你正在使用的實驗版本Visual Studio實例。 一旦你的擴充套件載入,除錯器應該會自動連接。

  3. 你可以在 Extensions 選單中找到這個新指令,如下圖所示:

    顯示 Visual Studio 中範例命令的螢幕擷取畫面。

    截圖顯示範例指令。

下一步

如果你錯過了入門概述,請參閱 Welcome to the VisualStudio.Extensibility 文件。

現在創造一個稍微有趣的延伸;請參見 建立一個簡單的擴充功能。