這份文件是一個快速入門文件,說明如何使用 VisualStudio.Extensibility 建立你的第一個擴充功能。 此擴充功能是在處理序外執行,也就是說,它是在 Visual Studio 處理序之外執行。
Prerequisites
- Visual Studio 2022 17.9 版預覽版 1 或更新版本,搭配
Visual Studio extension development工作負載。
建立延伸專案
- 使用
VisualStudio.Extensibility Project範本建立新的擴充功能專案。
此時,你已準備好開始擴充 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);
}
如需更多關於如何新增指令的資訊,請參閱 指令章 節。
偵錯您的擴充套件
請確保你的擴充專案在 Visual Studio 中被選為啟動專案,並按
F5開始除錯。按下
F5會建立你的擴充套件,並將其部署到你正在使用的實驗版本Visual Studio實例。 一旦你的擴充套件載入,除錯器應該會自動連接。你可以在
Extensions選單中找到這個新指令,如下圖所示:
下一步
如果你錯過了入門概述,請參閱 Welcome to the VisualStudio.Extensibility 文件。
現在創造一個稍微有趣的延伸;請參見 建立一個簡單的擴充功能。