Atualizar uma extensão do Visual Studio para Visual Studio 2022

Importante

Os conselhos neste artigo podem ajudar os desenvolvedores na migração de extensões que exigem grandes alterações para funcionar no Visual Studio 2019 e no Visual Studio 2022. Nesses casos, recomendamos que você tenha dois projetos VSIX e compilação condicional.

Muitas extensões funcionarão no Visual Studio 2019 e no Visual Studio 2022 com pequenas alterações que não exigirão seguir os conselhos sobre como modernizar sua extensão neste artigo. Experimente sua extensão no Visual Studio 2022 e avalie qual opção é melhor para sua extensão.

O Visual Studio 2022 é um aplicativo de 64 bits e apresenta algumas alterações significativas no SDK do Visual Studio. Este artigo orienta você pelas etapas necessárias para que sua extensão funcione com a versão de pré-visualização atual do Visual Studio 2022. Sua extensão pode estar pronta para os usuários instalarem antes que o Visual Studio 2022 atinja a disponibilidade geral.

Instalar o Visual Studio e compilar as extensões

Instale o Visual Studio 2022 em Downloads do Visual Studio 2022.

Extensões escritas em uma linguagem .NET

O SDK do Visual Studio que direciona o Visual Studio 2022 para extensões gerenciadas é exclusivamente no NuGet:

  • O metapacote Microsoft.VisualStudio.Sdk (versões 17.x) traz a maioria ou todos os assemblies de referência necessários.
  • O pacote Microsoft.VSSDK.BuildTools (versões 17.x) deve ser referenciado do projeto VSIX para que ele possa criar um VSIX compatível com o Visual Studio 2022.

Mesmo que você não faça referência a nenhuma alteração significativa, as extensões devem ser compiladas com a plataforma Any CPU ou x64. A plataforma x86 não é compatível com o processo de 64 bits no Visual Studio 2022.

Extensões escritas em C++

O SDK do Visual Studio para extensões compiladas com C++ está disponível com o SDK do Visual Studio instalado, como de costume.

Mesmo que você não faça referência a nenhuma alteração significativa, as extensões devem ser compiladas especificamente no SDK do Visual Studio 2022 e para AMD64.

Extensões com código em execução

As extensões com código em execução devem ser compiladas especificamente para o Visual Studio 2022. O Visual Studio 2022 não carregará nenhuma extensão direcionada a uma versão anterior do Visual Studio.

Saiba como migrar suas extensões de versões anteriores do Visual Studio para o Visual Studio 2022:

  1. Modernize seus projetos.
  2. Refatorar o código-fonte em um projeto compartilhado para permitir o direcionamento do Visual Studio 2022 e versões mais antigas.
  3. Adicione um projeto VSIX direcionado ao Visual Studio 2022 e uma tabela de remapeamento de pacote/assembly.
  4. Faça ajustes nos códigos conforme necessário.
  5. Teste sua extensão do Visual Studio 2022.
  6. Publique sua extensão do Visual Studio 2022.

Extensões sem código em execução

As extensões que não contêm nenhum código em execução (por exemplo, modelos de projeto ou item) não precisam seguir as etapas anteriores, incluindo a produção de dois VSIXs distintos.

Em vez disso, modifique o VSIX para que seu source.extension.vsixmanifest arquivo declare dois destinos de instalação:

<Installation>
   <InstallationTarget Id="Microsoft.VisualStudio.Community" Version="[15.0,17.0)">
      <ProductArchitecture>x86</ProductArchitecture>
   </InstallationTarget>
   <InstallationTarget Id="Microsoft.VisualStudio.Community" Version="[17.0,18.0)">
      <ProductArchitecture>amd64</ProductArchitecture>
   </InstallationTarget>
</Installation>

Você pode ignorar as etapas neste artigo sobre como usar projetos compartilhados e vários VSIXs. Você pode prosseguir com o teste.

Observação

Se você estiver fazendo uma nova extensão do Visual Studio usando o Visual Studio 2022 e também quiser direcionar o Visual Studio 2019 ou uma versão anterior, consulte este guia.

tarefas MSBuild

Se você criar tarefas do MSBuild, lembre-se de que, no Visual Studio 2022, é provável que elas sejam carregadas em um processo MSBuild.exe de 64 bits. Se sua tarefa exigir um processo de 32 bits para ser executada, consulte Configurar destinos e tarefas para garantir que o MSBuild carregue sua tarefa em um processo de 32 bits.

Modernizar seus projetos VSIX

Antes de adicionar o suporte do Visual Studio 2022 à sua extensão, é altamente recomendável que você limpe e modernize seu projeto atual:

  1. Migrar de packages.config para PackageReference.

  2. Substitua todas as referências diretas de assembly do SDK do Visual Studio por itens PackageReference:

    -<Reference Include="Microsoft.VisualStudio.OLE.Interop" />
    +<PackageReference Include="Microsoft.VisualStudio.OLE.Interop" Version="..." />
    

    Dica

    Você pode substituir muitas referências de assembly por apenas uma PackageReference instância para o metapacote:

    -<Reference Include="Microsoft.VisualStudio.OLE.Interop" />
    -<Reference Include="Microsoft.VisualStudio.Interop" />
    -<Reference Include="Microsoft.VisualStudio.Interop.8.0" />
    +<PackageReference Include="Microsoft.VisualStudio.Sdk" Version="..." />
    

    Certifique-se de escolher versões de pacote que correspondam à versão mínima do Visual Studio que você está direcionando.

Algumas montagens que não são exclusivas do SDK do Visual Studio (por exemplo, Newtonsoft.Json.dll) poderiam ter sido descobertas por meio de uma referência simples <Reference Include="Newtonsoft.Json" /> antes do Visual Studio 2022. Mas, no Visual Studio 2022, elas exigem uma referência de pacote. O motivo é que alguns diretórios de runtime e SDK do Visual Studio foram removidos do caminho de pesquisa de assembly padrão no MSBuild.

Ao alternar de referências diretas de assembly para referências de pacote NuGet, você pode selecionar referências de assembly adicionais e pacotes de analisador porque o NuGet instala automaticamente o fechamento transitivo de dependências. Isso em geral não é um problema, mas pode resultar em avisos adicionais durante a compilação. Analise os avisos e resolva o máximo que puder. Use as regiões no código #pragma warning disable <id> para suprimir avisos que você não pode resolver.

Usar projetos compartilhados para multidirecionamento

Projetos compartilhados são um tipo de projeto que foi introduzido no Visual Studio 2015. Os projetos compartilhados no Visual Studio permitem que os arquivos de código-fonte sejam compartilhados entre vários projetos e compilados de forma diferente usando símbolos de compilação condicional e conjuntos exclusivos de referências.

O Visual Studio 2022 requer um conjunto distinto de assemblies de referência de todas as versões anteriores do Visual Studio. Por isso recomendamos que você use projetos compartilhados para direcionar sua extensão para Visual Studio 2022, versões anteriores e versões posteriores. Com essa técnica, você terá compartilhamento de código, mas com referências distintas.

No contexto das extensões do Visual Studio, você pode ter um projeto VSIX para Visual Studio 2022 e posterior e um projeto VSIX para Visual Studio 2019 e versões anteriores. Cada um desses projetos conteria apenas uma instância source.extension.vsixmanifest, e o pacote faria referência ao SDK 16.x ou ao SDK 17.x. Esses projetos VSIX também teriam uma referência de projeto compartilhado para um novo projeto compartilhado que hospedará todo o código-fonte que pode ser compartilhado entre as duas versões do Visual Studio.

Esta seção considera que você já tenha um projeto VSIX direcionado ao Visual Studio 2019 e que deseja que sua extensão funcione no Visual Studio 2022.

Você pode concluir todas essas etapas usando o Visual Studio 2019:

  1. Se você ainda não tiver feito isso, modernize seus projetos para facilitar as etapas posteriores neste processo de atualização.

  2. Adicione um novo projeto compartilhado à sua solução para cada projeto existente que faz referência ao SDK do Visual Studio. Clique com o botão direito na solução e selecione Adicionar>Novo Projeto.

    Captura de tela que mostra as seleções para adicionar um novo projeto.

  3. Na caixa de diálogo Adicionar um novo projeto, pesquise o projeto compartilhado e selecione o modelo Projeto Compartilhado.

    Captura de tela que mostra a pesquisa e a seleção do modelo de Projeto Compartilhado.

  4. Adicione uma referência de cada projeto de referência do SDK do Visual Studio à sua contraparte do projeto compartilhado.

    Captura de tela que mostra as seleções para adicionar uma referência de projeto compartilhado.

  5. Mova todo o código-fonte (incluindo arquivos .cs e .resx) de cada projeto que faz referência ao SDK do Visual Studio para sua contraparte do projeto compartilhado. Deixe o arquivo source.extension.vsixmanifest no projeto VSIX.

    Captura de tela que mostra um projeto compartilhado com todos os arquivos de origem.

  6. Mova arquivos de metadados (por exemplo, notas de versão, licença e ícones) e arquivos VSCT para um diretório compartilhado. Em seguida, adicione-os como arquivos vinculados ao projeto VSIX. Observe que o diretório compartilhado fica separado do projeto compartilhado.

    Captura de tela que mostra seleções para adicionar metadados e arquivos V S C T como arquivos vinculados.

    • Para arquivos de metadados, defina Ação de Build como Conteúdo. Defina Incluir no VSIX como True.

      Captura de tela que mostra a inclusão de arquivos de metadados em V S I X.

    • Para arquivos VSCT, defina Ação de Build como VSCTCompile. Defina Incluir no VSIX como False.

      Captura de tela que mostra as propriedades selecionadas para um arquivo V S C T.

      Se o Visual Studio apontar que não há suporte para essa configuração, você poderá alterar manualmente a ação de build descarregando o projeto e alterando Content para VSCTCompile:

      -<Content Include="..\SharedFiles\VSIXProject1Package.vsct">
      -  <Link>VSIXProject1Package.vsct</Link>
      -</Content>
      +<VSCTCompile Include="..\SharedFiles\VSIXProject1Package.vsct">
      +  <Link>VSIXProject1Package.vsct</Link>
      +  <ResourceName>Menus.ctmenu</ResourceName>
      +</VSCTCompile>
      
  7. Crie seu projeto para confirmar que você não introduziu nenhum erro.

Seu projeto agora está pronto para adicionar suporte ao Visual Studio 2022.

Adicionar um direcionamento do Visual Studio 2022

Esta seção considera que você concluiu as etapas para fatorar sua extensão do Visual Studio com projetos compartilhados.

Adicione o suporte do Visual Studio 2022 à extensão usando as etapas a seguir. Você pode usar o Visual Studio 2019 para isso.

  1. Adicione um novo projeto VSIX à sua solução. Este projeto direcionará o Visual Studio 2022. Remova qualquer código-fonte que veio com o modelo, mas mantenha o arquivo source.extension.vsixmanifest.

  2. Em seu novo projeto VSIX, adicione uma referência ao mesmo projeto compartilhado a que seu VSIX direcionado ao Visual Studio 2019 faz referência.

    Captura de tela que mostra uma solução com um projeto compartilhado e dois projetos V S I X.

  3. Verifique se o novo projeto VSIX está compilado corretamente. Talvez seja necessário adicionar referências para corresponder com seu projeto VSIX original a fim de resolver quaisquer erros do compilador.

  4. Para extensões do Visual Studio gerenciadas, atualize suas referências de pacote de 16.x (ou anterior) para as versões de pacote 17.x no seu arquivo de projeto direcionado ao Visual Studio 2022. Use o Gerenciador de Pacotes NuGet ou edite diretamente o arquivo de projeto:

    -<PackageReference Include="Microsoft.VisualStudio.SDK" Version="16.0.206" />
    +<PackageReference Include="Microsoft.VisualStudio.SDK" Version="17.0" />
    -<PackageReference Include="Microsoft.VSSDK.BuildTools" Version="16.10.32" />
    +<PackageReference Include="Microsoft.VSSDK.BuildTools" Version="17.0" />
    

    As versões mostradas no código anterior são apenas um exemplo. Em seu código, use versões disponíveis no site do NuGet.

    Em muitos casos, as IDs de pacote foram alteradas. Para uma lista de alterações no Visual Studio 2022, consulte a tabela de mapeamento de pacote/assembly.

    As extensões escritas em C++ ainda não têm um SDK disponível para compilar.

  5. Para projetos C++, as extensões devem ser compiladas para AMD64. Para extensões gerenciadas, uma opção é alterar seu projeto de build para Qualquer CPU para direcionamento x64. Essa alteração garante que, no Visual Studio 2022, sua extensão sempre seja carregada em um processo de 64 bits. Qualquer CPU também é uma boa opção, mas pode produzir avisos se você fizer referência a qualquer binário nativo somente x64.

    Qualquer dependência que sua extensão possa ter em um módulo nativo terá que ser atualizada de uma imagem x86 para uma imagem AMD64.

  6. Edite o arquivo source.extension.vsixmanifest para refletir o direcionamento do Visual Studio 2022. Defina a tag <InstallationTarget> para indicar o Visual Studio 2022. Defina o elemento ProductArchitecture para indicar um payload do AMD64.

    <InstallationTarget Id="Microsoft.VisualStudio.Community" Version="[17.0,18.0)">
       <ProductArchitecture>amd64</ProductArchitecture>
    </InstallationTarget>
    

    Importante

    No Visual Studio 2019, o designer desse arquivo não expõe o novo elemento ProductArchitecture. Você precisa usar um editor XML para fazer essa alteração. Para acessar o editor XML, abra o Gerenciador de Soluções e selecione o comando Abrir Com.

    O elemento ProductArchitecture é essencial. O Visual Studio 2022 não instalará sua extensão sem ele.

    Elemento Valor Descrição
    ProductArchitecture x86, amd64 As plataformas que são compatíveis com esse VSIX. Não diferencia maiúsculas de minúsculas. Use uma plataforma por elemento e um elemento por instância de InstallationTarget. Para versões de produto inferiores a 17.0, o valor padrão é x86 e pode ser omitido. Para as versões 17.0 e posteriores do produto, esse elemento é necessário, e não há valor padrão. Para o Visual Studio 2022, o único conteúdo válido para esse elemento é amd64.
  7. Faça todos os outros ajustes necessários em source.extension.vsixmanifest para corresponder ao que tem como destino o Visual Studio 2019 (se houver).

    Se você estiver publicando duas versões de sua extensão, cada uma direcionada a uma versão diferente do Visual Studio, verifique se a ID do VSIX no elemento Identity do manifesto é diferente para cada extensão.

Nesse ponto, você tem uma extensão VSIX direcionada pelo Visual Studio 2022. Você deve criar seu projeto VSIX direcionado ao Visual Studio 2022 e trabalhar em todas as quebras de build que aparecerem. Se você não tiver quebras de build no projeto VSIX direcionado ao Visual Studio 2022, parabéns! Você está pronto para o teste.

Lidar com alterações significativas da API

Alterações significativas na API podem exigir atualizações no código executado em versões anteriores do Visual Studio. Para dicas sobre como atualizar seu código, consulte Alterações significativas da API no Visual Studio 2022.

Ao adaptar seu código, recomendamos que você use a compilação condicional. Seu código pode continuar a dar suporte a versões anteriores do Visual Studio enquanto adiciona suporte para Visual Studio 2022.

Quando você obtiver seu build de extensão direcionado ao Visual Studio 2022, prossiga para o teste.

Usar símbolos de compilação condicional

Se você quiser usar o mesmo código-fonte, até mesmo o mesmo arquivo, para Visual Studio 2022 e versões anteriores, talvez seja necessário usar a compilação condicional. Em seguida, você pode bifurcar seu código para se adaptar às alterações significativas. A compilação condicional é um recurso das linguagens C#, Visual Basic e C++. Ele pode ser usado para compartilhar a maioria dos códigos enquanto acomoda APIs divergentes em locais específicos.

Para mais informações sobre o uso de diretivas de pré-processador e símbolos de compilação condicional, consulte Diretivas do pré-processador C#.

Seus projetos direcionados a versões anteriores do Visual Studio precisarão de um símbolo de compilação condicional. Esse símbolo pode ser usado para bifurcar o código a fim de usar APIs diferentes. Você pode definir o símbolo de compilação condicional na página de propriedades do projeto:

Captura de tela que mostra a caixa para inserir um símbolo de compilação condicional.

Certifique-se de definir o símbolo de compilação para Todas as configurações. Por padrão, o símbolo inserido pode ser aplicado a apenas uma configuração.

Técnicas da C#:

Você pode usar o símbolo de compilação como uma diretiva de pré-processador (#if), conforme mostrado no código a seguir. Em seguida, você pode bifurcar seu código para lidar com uma alteração significativa entre as versões do Visual Studio.

    Guid myGuid = new Guid("{633FBA02-719B-40E7-96BF-0899767CD104}");
    uint myFlags = 0;
    IVsShell shell = await AsyncServiceProvider.GlobalProvider.GetServiceAsync<SVsShell, IVsShell>();
#if Dev16
    shell.LoadUILibrary(myGuid, myFlags, out uint ptrLib);
#else
    shell.LoadUILibrary(myGuid, myFlags, out IntPtr ptrLib);
#endif

Em alguns casos, você pode usar var para evitar nomear o tipo e evitar a necessidade de ter regiões #if. O trecho anterior também pode ser escrito como:

    Guid myGuid = new Guid("{633FBA02-719B-40E7-96BF-0899767CD104}");
    uint myFlags = 0;
    IVsShell shell = await AsyncServiceProvider.GlobalProvider.GetServiceAsync<SVsShell, IVsShell>();
    shell.LoadUILibrary(myGuid, myFlags, out var ptrLib);

Ao usar a sintaxe #if, observe como você pode usar a lista suspensa para o contexto do serviço de linguagem a fim de alterar o realce da sintaxe. A outra lista suspensa ajuda o serviço de linguagem a focar uma versão de destino do Visual Studio para essa extensão em vez de outra.

Captura de tela que mostra a compilação condicional em um projeto compartilhado.

Técnicas de compartilhamento XAML

O XAML não tem nenhum pré-processador para permitir a personalização do conteúdo com base em símbolos de pré-processador. Talvez seja necessário copiar e manter duas páginas XAML cujo conteúdo difira entre o Visual Studio 2022 e versões anteriores.

Em alguns casos, uma referência a um tipo que existe em assemblies distintos no Visual Studio 2022 e versões anteriores ainda pode ser representável em um arquivo XAML. Remova o namespace que faz referência ao assembly:

-xmlns:vsui="clr-namespace:Microsoft.VisualStudio.PlatformUI;assembly=Microsoft.VisualStudio.Shell.14.0"
-Value="{DynamicResource {x:Static vsui:TreeViewColors.SelectedItemActiveBrushKey}}"
+Value="{DynamicResource TreeViewColors.SelectedItemActiveBrushKey}"

Testar sua extensão

Para testar uma extensão direcionada ao Visual Studio 2022, você precisa ter o Visual Studio 2022 instalado. Você não poderá executar extensões de 64 bits em versões anteriores do Visual Studio.

Você pode usar o Visual Studio 2022 para compilar e testar suas extensões, independentemente de elas serem direcionadas ao Visual Studio 2022 ou a uma versão anterior. Quando você abre um projeto VSIX do Visual Studio 2022, uma instância experimental do Visual Studio é aberta.

É altamente recomendável que você teste cada versão do Visual Studio com que você queira que a extensão seja compatível.

Publicar sua extensão

Você adicionou e testou um destino do Visual Studio 2022 na sua extensão. Agora você já pode publicar a extensão.

Visual Studio Marketplace

Publicar sua extensão no Visual Studio Marketplace é uma ótima maneira de fazer com que novos usuários localizem e instalem sua extensão. Se sua extensão é direcionada exclusivamente ao Visual Studio 2022 ou também a versões mais antigas do Visual Studio, o Marketplace está lá para ajudar você.

No futuro, o Marketplace permitirá que você faça o upload de vários VSIXs em apenas uma listagem do Marketplace. Em seguida, você poderá carregar seu VSIX direcionado ao Visual Studio 2022 e um VSIX para uma versão anterior do Visual Studio. Seus usuários obterão automaticamente o VSIX correto para a versão do Visual Studio que instalaram quando estiverem usando o gerenciador de extensões do Visual Studio.

Instalador personalizado

Se você criar um arquivo MSI ou EXE para instalar sua extensão e gerar vsixinstaller.exe para instalar (parte da) sua extensão, saiba que o instalador VSIX no Visual Studio 2022 foi atualizado. Os desenvolvedores precisam usar a versão do instalador VSIX que vem com o Visual Studio 2022 para instalar extensões para essa versão do Visual Studio.

O instalador do VSIX no Visual Studio 2022 também instala extensões aplicáveis direcionadas a versões anteriores do Visual Studio que existem com o Visual Studio 2022 no mesmo computador.

Compartilhamento de rede

Você pode compartilhar sua extensão por uma LAN ou de qualquer outra forma. Se você direcionar o Visual Studio 2022 e versões anteriores, precisará compartilhar seus vários VSIXs individualmente. Dê a eles nomes de arquivo (ou coloque-os em pastas exclusivas) que ajudem os usuários a saber qual VSIX instalar com base na versão do Visual Studio que eles instalaram.

Dependências

Se o VSIX especificar outros VSIXs como dependências por meio do elemento <dependency>, cada VSIX referenciado precisará ser instalado nos mesmos destinos e arquiteturas de produto que o VSIX. Se um VSIX dependente não der suporte à instalação direcionada do Visual Studio, seu VSIX não funcionará.

O VSIX dependente pode oferecer suporte a mais destinos e arquiteturas do que o seu, mas não menos. Essa restrição significa que a abordagem de implantação e distribuição de um VSIX com dependências deve espelhar a de seus dependentes.

Perguntas e Respostas

P: Minha extensão não requer nenhuma alteração de interoperabilidade porque apenas fornece dados (por exemplo, modelos). Posso criar uma única extensão que também inclua o Visual Studio 2022?

R: Sim! Consulte Extensões sem código em execução para saber mais.

P: Uma dependência do NuGet está trazendo assemblies de interoperabilidade antigos e causando classes conflitantes. O que devo fazer?

R: Adicione a seguinte linha ao arquivo .csproj para evitar assemblies duplicados:

    <PackageReference Include="<Name of offending assembly>" ExcludeAssets="compile" PrivateAssets="all" />

Esse código impedirá que as referências de pacote importem a versão antiga do assembly de outras dependências.

P: Meus comandos e teclas de atalho pararam de funcionar no Visual Studio depois que alternei meus arquivos de origem para um projeto compartilhado. O que devo fazer?

R: A etapa 2.4 do exemplo do Otimizador de Imagem mostra como adicionar arquivos VSCT como itens vinculados para que eles sejam compilados em seu arquivo VSCT.

Siga um exemplo detalhado, ImageOptimizer, com links para o projeto e alterações de código para cada etapa.