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.
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:
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 DTE2
IBufferTagAggregatorFactoryService
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ů:
- knihovna tříd, která odkazuje jak na balíčky VisualStudio.Extensibility, tak sady Visual Studio SDK a obsahuje veškerý kód rozšíření.
- 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>
- Teď můžete dotazovat na instanci VisualStudioExtensibility prostřednictvím
GetServiceAsync
metody v balíčku nebo jiných komponentách:
...
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 natrue
. Tato vlastnost umožní kompatibilitu některých funkcí sady VSSDK.
<PropertyGroup>
<VssdkCompatibleExtension>true</VssdkCompatibleExtension>
</PropertyGroup>
- Vytvořte novou třídu rozšíření dědící ze
Extension
základní třídy a nastavte RequiresInProcessHosting vlastnost, jak je znázorněno dříve.
Teď můžete použít všechny funkce sady VisualStudio.Extensibility společně s existujícím rozšířením VSSDK.