同時使用 VisualStudio.Extensibility SDK 和 VSSDK
雖然 VisualStudio.Extensibility 模型主要是在devenv.exe程式之外裝載擴充功能,但可以在 Visual Studio 進程中執行的延伸模組中使用 VisualStudio.Extensibility SDK API,並使用 Microsoft.VisualStudio.Sdk 套件所提供的傳統擴充性 API。
支持內部使用方式是為了允許早期採用者使用新的 VisualStudio.Extensibility API,同時依賴 Microsoft.VisualStudio.Sdk 來涵蓋任何功能差距。
本檔是使用 VisualStudio.Extensibility SDK in-proc 之不同選項的快速逐步解說。
如果您正在開發新的擴充功能,我們建議的方法是建立在本教學課程之後裝載於進程中的VisualStudio.Extension。 除了能夠插入 VSSDK 和 MEF 服務之外,此方法還可讓您使用 VisualStudio.Extensibility SDK 的完整功能。
如果您有現有的 VSSDK 擴充功能,您可以遵循 這些秘訣 ,在您的延伸模組中使用新的 VisualStudioExtensibility 實例。
如果您想要使用 VisualStudio.Extensibility SDK 將命令、偵錯可視化檢視、工具視窗新增至現有的 VSSDK 擴充功能,您可以參考 這些秘訣 ,以裝載 VSSDK 延伸模組和相同 VS 延伸專案中的 VisualStudio.Extensibility 延伸模組。
建立您的第一個 VSSDK 相容的 VisualStudio.Extensibility 延伸模組
雖然 VisualStudio.Extensibility 模型主要是在devenv.exe程式之外裝載擴充功能,但從 Visual Studio 2022 17.4 Preview 1 開始,您可以建置裝載於 devenv.exe 內的 VisualStudio.Extensibility 擴充性延伸模組,並且可以使用 Microsoft.VisualStudio.Sdk 套件所提供的傳統擴充性 API。
必要條件
- Visual Studio 2022 17.9 版 Preview 1 或更新版本與
Visual Studio extension development
工作負載。 - 如果您要從舊版更新,請務必卸載 VisualStudio.Extensibility Project System,以避免潛在的衝突。
建立延伸模組專案
- 使用 VisualStudio.Extensibility Extension 搭配 VS SDK 相容性範本來建立新的解決方案。
對延伸模組進行偵錯
將 [容器 專案] 設定為 [啟始專案],按
F5
以開始偵錯。按
F5
會建置您的延伸模組,並將其部署至您所使用的Visual Studio版本實驗實例。 載入延伸模組之後,調試程序應該附加。您可以在選單中找到 命令
Extensions
,如下圖所示:
從 VisualStudio.Extensibility 擴充功能取用 Visual Studio SDK 服務
VS-SDK 相容的延伸模組項目會參考 Microsoft.VisualStudio.Sdk 套件,其允許存取所有 Visual Studio SDK 的服務。
傳統上,這類服務會透過 MEF 或 AsyncServiceProvider來取用。 建議改用 VisualStudio.Extensibility 擴充器來插入 .NET 相依性。
MefInjection<TService>
和 AsyncServiceProviderInjection<TService, TInterface>
類別(兩者皆來自Microsoft.VisualStudio.Extensibility.VSSdkCompatibility
命名空間),可讓您藉由將它們新增至透過相依性插入具現化類別的建構函式來取用Visual Studio SDK的服務(例如命令、工具視窗或擴充元件)。
下列範例示範如何將 DTE2
和 IBufferTagAggregatorFactoryService
服務新增至命令。
[VisualStudioContribution]
public class Command1 : Command
{
private TraceSource traceSource;
private AsyncServiceProviderInjection<DTE, DTE2> dte;
private MefInjection<IBufferTagAggregatorFactoryService> bufferTagAggregatorFactoryService;
public Command1(
VisualStudioExtensibility extensibility,
TraceSource traceSource,
AsyncServiceProviderInjection<DTE, DTE2> dte,
MefInjection<IBufferTagAggregatorFactoryService> bufferTagAggregatorFactoryService)
: base(extensibility)
{
this.dte = dte;
this.bufferTagAggregatorFactoryService = bufferTagAggregatorFactoryService;
}
public override CommandConfiguration CommandConfiguration => new("Sample Remote Command")
{
Placements = new[] { CommandPlacement.KnownPlacements.ExtensionsMenu },
Icon = new(ImageMoniker.KnownValues.Extension, IconSettings.IconAndText),
};
VSSDK 相容 VisualStudio.Extensibility 延伸模組的結構
雖然搭配 VS SDK 相容性範本使用 VisualStudio.Extensibility Extension 會負責設定整個解決方案,但瞭解 VS-SDK 相容 VisualStudio.Extensibility 延伸模組的基本元件,以及它與「建立您的第一個擴充功能」指南中所述的常見變體有何不同,這非常有用。
容器專案
VS-SDK 兼容的 VisualStudio.Extensibility 解決方案是由兩個專案所組成:
- 參考 VisualStudio.Extensibility 和 Visual Studio SDK 套件的類別庫,並包含延伸模組的所有程式代碼,
- 您用來部署和偵錯延伸模組的容器 VSIX 專案。
當 VisualStudio.Extensibility 處於預覽狀態且最終封裝和部署設計完成時,此區隔是暫時的解決方案。
擴充器不應該將程式代碼、內容或資源新增至容器專案。 容器專案的唯一目標是包含其他專案所提供的資產。
TargetFramework
延伸模組專案和容器專案都必須以目標Visual Studio版本所使用的 .NET 版本為目標。 針對 Visual Studio 2022,他們必須以 .NET Framework 4.7.2 為目標。
RequiresInProcessHosting 屬性
類別 Extension
必須設定為 屬性, RequiresInProcessHosting = true
以識別延伸模組為 同進程。
[VisualStudioContribution]
internal class MyExtension : Extension
{
public override ExtensionConfiguration? ExtensionConfiguration => new()
{
RequiresInProcessHosting = true,
};
...
從現有的 VSSDK 擴充功能使用 VisualStudio.Extensibility
對於現有的 VSSDK 延伸模組,另一個選項是透過服務提供者查詢 VisualStudioExtensibility 實例,並利用其方法。 這個方法可讓您在現有的元件中使用VisualStudio.Extensibility SDK 的新 API 介面區。 此選項在您想要使用新的 API 來查詢專案資訊、檔管理,而不需建立新的 VisualStudio.Extensibility 型擴充功能的情況下,這個選項很有用。
以下是示範如何在 VSSDK 套件內利用 VisualStudioExtensibility
的範例代碼段:
- 在您的
.csproj
檔案中,包含 VisualStudio.Extensibility API 的套件參考:
<ItemGroup>
<PackageReference Include="Microsoft.VisualStudio.Extensibility" Version="17.9.23-preview-1" />
</ItemGroup>
- 您現在可以透過
GetServiceAsync
封裝或其他元件中的 方法來查詢 VisualStudioExtensibility 實例:
...
using Microsoft.VisualStudio.Extensibility;
...
public class VSSDKPackage : AsyncPackage
{
protected override async Task InitializeAsync(CancellationToken cancellationToken, IProgress<ServiceProgressData> progress)
{
VisualStudioExtensibility extensibility = await this.GetServiceAsync<VisualStudioExtensibility, VisualStudioExtensibility>();
await extensibility.Shell().ShowPromptAsync("Hello from in-proc", PromptOptions.OK, cancellationToken);
...
}
}
將 VisualStudio.Extensibility 擴充功能新增至現有的 VSSDK 擴充功能專案
如果您也想要參與工具視窗等元件,請在現有的 VSSDK 擴充功能中使用 VisualStudio.Extensibility SDK 的編輯器接聽程式,您必須遵循其他步驟,在您的專案中建立 VisualStudio.Extensibility Extension 實例。
您需要 SDK 樣式
.csproj
,才能利用 VisualStudio.Extensibility SDK 套件。 針對現有的專案,您可能需要將 更新.csproj
為 SDK 樣式。拿掉的
Microsoft.VSSDK.BuildTools
套件參考,並改為新增VisualStudio.Extensibility的套件參考。
<PackageReference Include="Microsoft.VisualStudio.Extensibility.Sdk" Version="17.9.23-preview-1" />
<PackageReference Include="Microsoft.VisualStudio.Extensibility.Build" Version="17.9.23-preview-1" />
- 將屬性新增
VssdkCompatibleExtension
至項目檔,並將設定為true
。 此屬性會啟用某些 VSSDK 功能以取得相容性。
<PropertyGroup>
<VssdkCompatibleExtension>true</VssdkCompatibleExtension>
</PropertyGroup>
- 建立繼承自
Extension
基類的新擴充類別,並設定 RequiresInProcessHosting 屬性,如先前所示。
您現在可以使用 VisualStudio.Extensibility 的所有功能,以及現有的 VSSDK 擴充功能。