這份文件是一個快速入門文件,說明如何使用 VisualStudio.Extensibility 建立你的第一個擴充功能。 此擴充功能是在處理序外執行,也就是說,它是在 Visual Studio 處理序之外執行。
Prerequisites
- 建議使用 Visual Studio 2026 版本 18.11 或更新版本,並搭配 Visual Studio 擴充功能開發工作負載。 對於較早期版本,VisualStudio.Extensibility 需要 Visual Studio 2022 版本 17.9 或更新版本。
建立延伸專案
Visual Studio 18.11 或更新版本以上(建議)
使用 Modern VSIX Project 範本,並在 擴充功能類型 下選擇 VisualStudio.Extensibility (Out-Of-Process)。 範本預設為 VSSDK,因此請為這個快速入門選擇外部處理序選項。
請參考 使用 Modern VSIX Project 範本建立擴充功能中的精靈步驟與專案 SDK 選項。
早期的 Visual Studio 版本
使用 VisualStudio.Extensibility Project 範本來建立一個新的 Extensibility project。
此時,你已準備好開始擴充 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);
}
如需更多關於如何新增指令的資訊,請參閱 指令章 節。
偵錯您的擴充套件
請確保你的擴充專案在 Visual Studio 中被選為啟動專案,並按
F5開始除錯。按下
F5鍵會建置你的擴充功能,並將其部署到你所使用的 Visual Studio 版本的實驗執行個體。 一旦你的擴充套件載入,除錯器應該會自動連接。你可以在
Extensions選單中找到這個新指令,如下圖所示: