Partilhar via


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.

Captura de tela do modelo de projeto de extensão em processo VisualStudio.Extensibility .

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:

    Captura de tela mostrando o comando de extensão de exemplo.

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 como true. 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 adicionando ExtensionType="VSSDK+VisualStudio.Extensibility" à marca Installation.
<Installation ExtensionType="VSSDK+VisualStudio.Extensibility">

Agora você pode usar todos os recursos do VisualStudio.Extensibility junto com sua extensão VSSDK existente.