Usando o VisualStudio.Extensibility SDK e VSSDK juntos
Embora o modelo VisualStudio.Extensibility tenha sido criado principalmente para hospedar extensões fora do processo de devenv.exe, é possível usar APIs do SDK do VisualStudio.Extensibility em uma extensão em execução no processo do Visual Studio e utilizando APIs de extensibilidade tradicionais fornecidas pelos pacotes Microsoft.VisualStudio.Sdk.
O suporte ao uso de in-proc de destina-se a permitir que os adotantes iniciais acedam às novas APIs do VisualStudio.Extensibility enquanto dependem do Microsoft.VisualStudio.Sdk para cobrir qualquer lacuna de funcionalidades.
Este documento é um passo a passo rápido sobre diferentes opções para utilizar o VisualStudio.Extensibility SDK in-proc.
Se estiver a desenvolver uma nova extensão, o nosso método recomendado é criar uma VisualStudio.Extension que é hospedada em modo de processo seguindo este tutorial. Esse método permite que você use todos os recursos do VisualStudio.Extensibility SDK, além de poder injetar serviços VSSDK e MEF.
Se tiveres uma extensão VSSDK existente, podes seguir estas dicas para usar a nova instância VisualStudioExtensibility na tua extensão.
Se pretender adicionar comandos, visualizadores de depuração, janelas de ferramentas à sua extensão VSSDK existente, utilizando o VisualStudio.Extensibility SDK, pode consultar estas dicas para hospedar tanto uma extensão VSSDK quanto uma extensão VisualStudio.Extensibility no mesmo projeto de extensão Visual Studio.
Crie sua primeira extensão VisualStudio.Extensibility compatível com VSSDK
Embora o modelo VisualStudio.Extensibility tenha sido criado principalmente para hospedar extensões fora do processo de devenv.exe, a partir do Visual Studio 2022 17.4 Preview 1, é possível criar uma extensão VisualStudio.Extensibility hospedada em devenv.exe e pode usar APIs de extensibilidade tradicionais fornecidas pelos pacotes Microsoft.VisualStudio.Sdk.
Pré-requisitos
- Visual Studio 2022 versão 17.9 Preview 1 ou superior com o perfil de trabalho
Visual Studio extension development
. - Se você estiver atualizando a partir de compilações anteriores, certifique-se de desinstalar o VisualStudio.Extensibility Project System para evitar possíveis conflitos.
Criar o projeto de extensão
- Use o modelo VisualStudio.Extensibility Extension with VSSDK Compatibility para criar uma nova solução.
Depurar a sua extensão
Pressione
F5
para iniciar a depuração, isso cria sua extensão e a implanta na instância experimental da versão do Visual Studio que você está usando. O depurador deve ser ligado assim que a extensão for carregada.Você pode encontrar o comando em
Extensions
menu como mostrado na imagem a seguir:
Utilização dos serviços do SDK do Visual Studio a partir de uma extensão Visual Studio Extensibility
Um projeto de extensão compatível com o VS-SDK referencia o pacote Microsoft.VisualStudio.Sdk, que permite o acesso a todos os serviços do SDK do Visual Studio.
Tradicionalmente, esses serviços são consumidos por meio do MEF ou do AsyncServiceProvider. Em vez disso, um extensor VisualStudio.Extensibility é incentivado a a injeção de dependência do .NET.
As classes MefInjection<TService>
e AsyncServiceProviderInjection<TService, TInterface>
(ambas do namespace Microsoft.VisualStudio.Extensibility.VSSdkCompatibility
) permitem que você consuma os serviços do SDK do Visual Studio adicionando-os ao construtor de uma classe que é instanciada por meio de injeção de dependência (como um comando, janela de ferramenta ou parte de extensão).
O exemplo a seguir mostra como os serviços DTE2
e IBufferTagAggregatorFactoryService
podem ser adicionados a um comando.
[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),
};
Anatomia de uma extensão VisualStudio.Extensibility compatível com VSSDK
Embora o uso do modelo VisualStudio.Extensibility Extension with VSSDK Compatibility cuide da configuração de todo o projeto, é útil saber quais são os componentes básicos de uma extensão VisualStudio.Extensibility compatível com VS-SDK e como ela difere da variante comum descrita no guia "crie sua primeira extensão".
TargetFramework e VssdkCompatibleExtension
O projeto de extensão deve ter como destino a versão .NET usada pela versão de destino do Visual Studio. Para o Visual Studio 2022, eles devem ter como destino o .NET Framework 4.7.2.
O projeto de extensão também deve conter a propriedade VssdkCompatibleExtension
definida como true
.
<PropertyGroup>
<VssdkCompatibleExtension>true</VssdkCompatibleExtension>
</PropertyGroup>
Propriedade RequiresInProcessHosting
A classe Extension
deve ser configurada com a propriedade RequiresInProcessHosting = true
que identifica a extensão como sendo em processo.
[VisualStudioContribution]
internal class MyExtension : Extension
{
public override ExtensionConfiguration? ExtensionConfiguration => new()
{
RequiresInProcessHosting = true,
};
...
Manifesto do pacote
O projeto de extensão deve incluir um manifesto de pacote chamado source.extension.vsixmanifest
. A tag Installation
deve ter ExtensionType
definida como 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>
Usar extensões VSSDK existentes com o VisualStudio.Extensibility
Para extensões VSSDK existentes, outra opção é consultar a instância VisualStudioExtensibility por meio do provedor de serviços e utilizar os seus métodos. Esse método permite que você use a nova área de superfície da API do VisualStudio.Extensibility SDK em seus componentes existentes. Essa opção pode ser útil em situações em que você gosta de usar a nova API para consultar informações do projeto, gerenciamento de documentos sem criar uma nova extensão baseada em VisualStudio.Extensibility.
Aqui está um trecho de código de exemplo que mostra como se pode utilizar VisualStudioExtensibility
dentro de um pacote VSSDK:
- No arquivo
.csproj
, inclua uma referência de pacote para as APIs de Extensibilidade do VisualStudio:
<ItemGroup>
<PackageReference Include="Microsoft.VisualStudio.Extensibility" Version="17.9.2092" />
</ItemGroup>
- Agora pode consultar a instância VisualStudioExtensibility através do método
GetServiceAsync
no seu pacote ou noutros componentes:
...
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);
...
}
}
Adicionar uma extensão VisualStudio.Extensibility a um projeto de extensão VSSDK existente
Caso queira também contribuir com componentes como janelas de ferramentas e ouvintes de editor usando o VisualStudio.Extensibility SDK dentro da sua extensão VSSDK existente, será necessário seguir etapas adicionais para criar uma instância de VisualStudio.Extensibility de extensão no seu projeto.
Você precisa de um SDK estilo
.csproj
para utilizar pacotes do SDK do VisualStudio.Extensibility. Para projetos existentes, talvez seja necessário atualizar seu.csproj
para um estilo SDK.Remova a referência de pacote para
Microsoft.VSSDK.BuildTools
e, em vez disso, adicione referências de pacote para VisualStudio.Extensibility.
<PackageReference Include="Microsoft.VisualStudio.Extensibility.Sdk" Version="17.9.2092" />
<PackageReference Include="Microsoft.VisualStudio.Extensibility.Build" Version="17.9.2092" />
- Adicione
VssdkCompatibleExtension
propriedade ao seu arquivo de projeto, definindo-o comotrue
. Essa propriedade habilitará alguns recursos VSSDK para compatibilidade.
<PropertyGroup>
<VssdkCompatibleExtension>true</VssdkCompatibleExtension>
</PropertyGroup>
- Crie uma nova classe de extensão herdando da classe base
Extension
e defina a propriedade RequiresInProcessHosting como mostrado anteriormente. - Modifique o ficheiro
source.extension.vsixmanifest
adicionandoExtensionType="VSSDK+VisualStudio.Extensibility"
à marcaInstallation
.
<Installation ExtensionType="VSSDK+VisualStudio.Extensibility">
Agora você pode usar todos os recursos do VisualStudio.Extensibility junto com sua extensão VSSDK existente.