Společné použití sady VisualStudio.Extensibility SDK a sady VSSDK

I když byl model VisualStudio.Extensibility vytvořen především pro hostování rozšíření mimo proces devenv.exe, je možné použít rozhraní API sady VisualStudio.Extensibility SDK v rozšíření spuštěném v procesu sady Visual Studio a využívat tradiční rozhraní API rozšiřitelnosti poskytovaná balíčky Microsoft.VisualStudio.Sdk .

Podpora in-proc využití je určena k tomu, aby umožnili dřívějším osvojování nových rozhraní VisualStudio.Extensibility API a spoléháte se na Microsoft.VisualStudio.Sdk , aby se kryly všechny mezery v funkcích.

Tento dokument je rychlý návod k různým možnostem využití sady VisualStudio.Extensibility SDK v proc.

  • Pokud vyvíjíte nové rozšíření, naší doporučenou metodou je vytvoření rozšíření VisualStudio.Extension hostované v průběhu tohoto kurzu. Tato metoda umožňuje kromě možnosti vkládat služby VSSDK a MEF také pomocí sady VisualStudio.Extensibility SDK.

  • Pokud máte existující rozšíření VSSDK, můžete podle těchto tipů použít novou instanci VisualStudioExtensibility ve vašem rozšíření.

  • Pokud chcete přidat příkazy, ladicí vizualizéry, okna nástrojů do existujícího rozšíření VSSDK pomocí sady VisualStudio.Extensibility SDK, můžete se na tyto tipy podívat a hostovat rozšíření VSSDK i rozšíření VisualStudio.Extensibility ve stejném projektu rozšíření VS.

Vytvoření prvního rozšíření VisualStudio.Extensibility kompatibilní s VSSDK

Zatímco byl model VisualStudio.Extensibility vytvořen primárně pro hostování rozšíření mimo proces devenv.exe, počínaje sadou Visual Studio 2022 17.4 Preview 1 je možné vytvořit rozšíření VisualStudio.Extensibility hostované v rámci devenv.exe a může používat tradiční rozhraní API rozšiřitelnosti poskytovaná balíčky Microsoft.VisualStudio.Sdk .

Požadavky

  • Visual Studio 2022 verze 17.9 Preview 1 nebo vyšší s úlohou Visual Studio extension development
  • Pokud aktualizujete ze starších buildů, nezapomeňte odinstalovat projektový systém VisualStudio.Extensibility, abyste se vyhnuli možným konfliktům.

Vytvoření projektu rozšíření

  • K vytvoření nového řešení použijte rozšíření VisualStudio.Extensibility s šablonou kompatibility sady VS SDK.

Screenshot of the VisualStudio.Extensibility in-process extension project template.

Ladění rozšíření

  • Pokud chcete spustit ladění, nastavte F5 projekt kontejnerujako spouštěný projekt.

  • Stisknutím F5 sestavení sestavíte rozšíření a nasadíte ho do experimentální instance verze sady Visual Studio, kterou používáte. Ladicí program by se měl připojit po načtení rozšíření.

  • Příkaz najdete v Extensions nabídce, jak je znázorněno na následujícím obrázku:

    Screenshot showing sample extension command.

Využívání služeb sady Visual Studio SDK z rozšíření VisualStudio.Extensibility

Projekt rozšíření kompatibilní se sadou VS-SDK odkazuje na balíček Microsoft.VisualStudio.Sdk, který umožňuje přístup ke všem službám sady Visual Studio SDK .

Tyto služby se tradičně využívají prostřednictvím MEF nebo AsyncServiceProvider. Rozšíření rozšíření VisualStudio.Extensibility se místo toho doporučuje injektáž závislostí .NET.

AsyncServiceProviderInjection<TService, TInterface> Třídy MefInjection<TService> (jak z Microsoft.VisualStudio.Extensibility.VSSdkCompatibility oboru názvů), umožňují využívat služby sady Visual Studio SDK přidáním do konstruktoru třídy, která se vytvoří instance prostřednictvím injektáže závislostí (například příkaz, okno nástroje nebo část rozšíření).

Následující příklad ukazuje, jak lze přidat služby DTE2IBufferTagAggregatorFactoryService a služby do příkazu.

    [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),
        };

Anatomie rozšíření VisualStudio.Extensibility kompatibilní s VSSDK

Při použití rozšíření VisualStudio.Extensibility s šablonou kompatibility sady VS SDK se postará o nastavení celého řešení, je užitečné vědět, jaké jsou základní komponenty rozšíření VisualStudio.Extensibility kompatibilní se sadou VS-SDK a jak se liší od běžné varianty popsané v průvodci vytvořením prvního rozšíření.

Projekt kontejneru

Řešení VisualStudio.Extensibility kompatibilní se sadou VS-SDK se skládá ze dvou projektů:

  1. knihovna tříd, která odkazuje jak na balíčky VisualStudio.Extensibility, tak sady Visual Studio SDK a obsahuje veškerý kód rozšíření.
  2. kontejnerový projekt VSIX, který používáte k nasazení a ladění rozšíření.

Toto oddělení je dočasné řešení, zatímco VisualStudio.Extensibility je ve verzi Preview a konečné balení a návrh nasazení se finalizuje.

Extender by do projektu kontejneru neměl přidávat kód, obsah ani prostředky. Jediným cílem projektu kontejneru je zahrnout prostředky poskytované jiným projektem.

Targetframework

Projekt rozšíření i projekt kontejneru musí cílit na verzi .NET používanou cílovou verzí sady Visual Studio. V sadě Visual Studio 2022 musí cílit na rozhraní .NET Framework 4.7.2.

RequiresInProcessHosting – vlastnost

Extension Třída musí být nakonfigurována s RequiresInProcessHosting = true vlastností, která identifikuje rozšíření jako v procesu.

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

    ...

Použití rozšíření VisualStudio.Extensibility z existujících rozšíření VSSDK

U existujících rozšíření VSSDK je další možností dotazování instance VisualStudioExtensibility prostřednictvím poskytovatele služeb a využití jeho metod. Tato metoda umožňuje použít novou plochu rozhraní API sady VisualStudio.Extensibility SDK ve stávajících komponentách. Tato možnost může být užitečná v situacích, kdy chcete pomocí nového rozhraní API dotazovat informace o projektu, správu dokumentů bez vytvoření nového rozšíření založeného na visualStudio.Extensibility.

Tady je příklad fragmentu kódu, který ukazuje, jak se dá využít VisualStudioExtensibility v rámci balíčku VSSDK:

  • Do souboru zahrňte .csproj odkaz na visualStudio.Extensibility API:
  <ItemGroup>
    <PackageReference Include="Microsoft.VisualStudio.Extensibility" Version="17.9.23-preview-1" />
  </ItemGroup>
...
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);
        ...
    }
}

Přidání rozšíření VisualStudio.Extensibility do existujícího projektu rozšíření VSSDK

Pokud chcete také přispívat komponentami, jako jsou okna nástrojů, naslouchací procesy editoru pomocí sady VisualStudio.Extensibility SDK ve stávajícím rozšíření VSSDK, budete muset postupovat podle dalších kroků k vytvoření instance rozšíření VisualStudio.Extensibility v projektu.

  • K využití balíčků VisualStudio.Extensibility SDK potřebujete styl .csproj sady SDK. U existujících projektů možná budete muset aktualizovat .csproj styl sady SDK.

  • Odeberte odkaz na balíček a Microsoft.VSSDK.BuildTools místo toho přidejte odkazy na balíčky pro 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" />
  • Přidejte VssdkCompatibleExtension do souboru projektu vlastnost a nastavte ji na true. Tato vlastnost umožní kompatibilitu některých funkcí sady VSSDK.
<PropertyGroup>
    <VssdkCompatibleExtension>true</VssdkCompatibleExtension>
</PropertyGroup>    

Teď můžete použít všechny funkce sady VisualStudio.Extensibility společně s existujícím rozšířením VSSDK.