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

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

Prerequisites

  • 建議使用 Visual Studio 2026 版本 18.11 或更新版本,並搭配 Visual Studio 擴充功能開發工作負載。 對於較早期版本,VisualStudio.Extensibility 需要 Visual Studio 2022 版本 17.9 或更新版本。

建立延伸專案

使用 Modern VSIX Project 範本,並在 擴充功能類型 下選擇 VisualStudio.Extensibility (Out-Of-Process)。 範本預設為 VSSDK,因此請為這個快速入門選擇外部處理序選項。

請參考 使用 Modern VSIX Project 範本建立擴充功能中的精靈步驟與專案 SDK 選項。

早期的 Visual Studio 版本

使用 VisualStudio.Extensibility Project 範本來建立一個新的 Extensibility project。

VSExtensibility 範本的截圖。

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

Extension 類別

該範本建立一個擴展 Extension ↗ 的類別。 這個類別是載入擴充功能時第一個實例化的類別。 在 InitializeServices ↗ 方法中,你可以將自己的服務加入服務集合,讓它們可供依賴注入。

[VisualStudioContribution]
internal class ExtensionEntrypoint : Extension
{
    public override ExtensionConfiguration ExtensionConfiguration => new()
    {
        Metadata = new(
            id: "MyExtension.abc123",
            version: this.ExtensionAssemblyVersion,
            publisherName: "My Company",
            displayName: "My Extension"),
    };

    protected override void InitializeServices(IServiceCollection serviceCollection)
    {
        base.InitializeServices(serviceCollection);

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

你也可以看到用來標記供 Visual Studio 使用之擴充元件的 VisualStudioContribution ↗ 屬性。 此屬性可套用於實作 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 this.Extensibility.Shell().ShowPromptAsync(
        "Hello from an extension!", 
        PromptOptions.OK, 
        cancellationToken);
}

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

偵錯您的擴充套件

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

  2. 按下 F5 鍵會建置你的擴充功能,並將其部署到你所使用的 Visual Studio 版本的實驗執行個體。 一旦你的擴充套件載入,除錯器應該會自動連接。

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

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

    截圖顯示範例指令。

下一步