共用方式為


同時使用 VisualStudio.Extensibility SDK 和 VSSDK

雖然 VisualStudio.Extensibility 模型主要是為了在 devenv.exe 程序之外裝載擴充套件,但可以在 Visual Studio 過程中運行的擴充套件中使用 VisualStudio.Extensibility SDK API,並利用 Microsoft.VisualStudio.Sdk 所提供的傳統擴充性 API 套件。

內部 使用方式的支援,旨在讓早期採用者可以使用新的 VisualStudio.Extensibility APIs,同時依賴 Microsoft.VisualStudio.Sdk 來填補任何功能缺口。

本文件是關於如何在內部程序中使用 VisualStudio.Extensibility SDK 的各種選項的快速指南。

  • 如果您要開發新的擴充功能,我們建議的方法是建立 VisualStudio.Extension,此擴充功能裝載於程式內,本教學課程。 除了能夠插入 VSSDK 和 MEF 服務之外,此方法還可讓您使用 VisualStudio.Extensibility SDK 的完整功能。

  • 如果您有現有的 VSSDK 擴充功能,您可以遵循 這些建議, 在您的擴充功能中使用新的 VisualStudioExtensibility 實例。

  • 如果您想要使用 VisualStudio.Extensibility SDK 將命令、偵錯可視化工具、工具視窗新增至現有的 VSSDK 延伸模組,您可以參考 這些秘訣 同時裝載 VSSDK 延伸模組和 VisualStudio.Extensibility 延伸模組於相同的 VS 擴充專案中。

建立第一個 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 搭配 VSSDK 相容性 範本來建立新的解決方案。

VisualStudio.Extensibility 的內部擴充功能專案範本螢幕截圖。

對擴充功能進行偵錯

  • F5 開始偵錯,這會建置您的延伸模組,並將其部署至您所使用的Visual Studio版本實驗實例。 載入延伸模組之後,偵錯工具應該連接。

  • 您可以在 [Extensions] 選單中找到 命令,如下圖所示:

    顯示範例擴充功能命令的螢幕快照。

從 VisualStudio.Extensibility 擴充套件中使用 Visual Studio SDK 服務

VS-SDK 相容的延伸模組專案會參考 Microsoft.VisualStudio.Sdk 套件,其允許存取所有 Visual Studio SDK 的服務。

傳統上,這類服務會透過 MEFAsyncServiceProvider取用。 建議改用 VisualStudio.Extensibility 擴充器 .NET 相依性插入

MefInjection<TService>AsyncServiceProviderInjection<TService, TInterface> 類別(兩者皆來自 Microsoft.VisualStudio.Extensibility.VSSdkCompatibility 命名空間),可讓您藉由將它們新增至透過相依性插入具現化類別的建構函式來取用 Visual Studio SDK 的服務(例如命令、工具視窗或擴充元件)。

下列範例示範如何將 DTE2IBufferTagAggregatorFactoryService 服務新增至命令。

    [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 擴充套件的結構分析

雖然使用 VisualStudio.Extensibility Extension 搭配 VSSDK 相容性 範本會負責設定整個專案,但瞭解 VS-SDK 相容 VisualStudio.Extensibility 延伸模組的基本元件,以及它與 「建立您的第一個擴充功能」指南中所述的常見變體有何不同,這非常有用。

TargetFramework 和 VssdkCompatibleExtension

延伸模組項目必須以目標 Visual Studio 版本所使用的 .NET 版本為目標。 針對 Visual Studio 2022,他們必須以 .NET Framework 4.7.2 為目標。

擴充項目也必須包含設定為 VssdkCompatibleExtensiontrue 屬性。

<PropertyGroup>
  <VssdkCompatibleExtension>true</VssdkCompatibleExtension>
</PropertyGroup>

RequiresInProcessHosting 屬性

Extension 類別必須設定為 RequiresInProcessHosting = true 屬性,該屬性會將擴充功能識別為 同進程

[VisualStudioContribution]
internal class MyExtension : Extension
{
    public override ExtensionConfiguration? ExtensionConfiguration => new()
    {
        RequiresInProcessHosting = true,
    };

    ...

套件清單

擴充項目必須包含名為 source.extension.vsixmanifestInstallation 標籤必須將 ExtensionType 設定為 VSSDK+VisualStudio.Extensibility

<?xml version="1.0" encoding="utf-8"?>
<PackageManifest Version="2.0.0" xmlns="http://schemas.microsoft.com/developer/vsx-schema/2011" xmlns:d="http://schemas.microsoft.com/developer/vsx-schema-design/2011">
    <Metadata>
        <Identity Id="MyExtensionId.f14b8c45-154f-4584-abd7-9ec22af003e2" Version="1.0" Language="en-US" Publisher="Microsoft" />
        <DisplayName>My extension</DisplayName>
        <Description xml:space="preserve">My extension's description.</Description>
    </Metadata>
    <Installation ExtensionType="VSSDK+VisualStudio.Extensibility">
        <InstallationTarget Id="Microsoft.VisualStudio.Community" Version="[17.9,18.0)">
            <ProductArchitecture>amd64</ProductArchitecture>
        </InstallationTarget>
      <InstallationTarget Id="Microsoft.VisualStudio.Community" Version="[17.9,18.0)">
        <ProductArchitecture>arm64</ProductArchitecture>
      </InstallationTarget>
    </Installation>
    <Prerequisites>
        <Prerequisite Id="Microsoft.VisualStudio.Component.CoreEditor" Version="[17.0,)" DisplayName="Visual Studio core editor" />
    </Prerequisites>
    <Assets>
        <Asset Type="Microsoft.VisualStudio.VsPackage" d:Source="Project" d:ProjectName="%CurrentProject%" Path="|%CurrentProject%;PkgdefProjectOutputGroup|" />
    </Assets>
</PackageManifest>

使用來自於現有 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.2092" />
  </ItemGroup>
  • 您現在可以透過套件或其他元件中的 方法,查詢 GetServiceAsync 實例:
...
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.2092" />
    <PackageReference Include="Microsoft.VisualStudio.Extensibility.Build" Version="17.9.2092" />
  • VssdkCompatibleExtension 屬性新增至項目檔,並將它設定為 true。 此屬性會啟用某些 VSSDK 功能以取得相容性。
<PropertyGroup>
    <VssdkCompatibleExtension>true</VssdkCompatibleExtension>
</PropertyGroup>    
  • 建立繼承自 Extension 基類的新擴充類別,並設定 RequiresInProcessHosting 屬性,如先前所示。
  • 修改 source.extension.vsixmanifest 檔案,將 ExtensionType="VSSDK+VisualStudio.Extensibility" 新增至 Installation 標籤。
<Installation ExtensionType="VSSDK+VisualStudio.Extensibility">

您現在可以使用 VisualStudio.Extensibility 的所有功能,以及現有的 VSSDK 擴充功能。