Alterações de API recentes no Visual Studio 2022

Se você estiver migrando uma extensão para o Visual Studio 2022, as alterações recentes listadas aqui podem afetá-lo.

Assemblies de referência não mais instalados

Muitos dos assemblies que você pode estar referenciando que o MSBuild resolvido a partir de um diretório de instalação do Visual Studio não estão mais instalados. Você deve usar o NuGet para adquirir os assemblies ref do SDK do Visual Studio necessários. Consulte Modernizar projetos para obter etapas detalhadas sobre como fazer isso.

APIs removidas

No Visual Studio 2022, várias APIs foram removidas como parte da movimentação do Visual Studio daqui para frente. Uma lista das APIs removidas pode ser encontrada na página Lista de APIs removidas.

Mudanças de quebra de interoperabilidade

Muitas de nossas APIs foram alteradas no Visual Studio 2022, geralmente com alterações simples que são diretas para seu código acomodar.

Para gerenciar as mudanças de ruptura, estamos planejando fornecer um novo mecanismo para a distribuição de montagens de interoperabilidade. Especificamente, para o Visual Studio 2022 e além, fornecemos um único assembly de interoperabilidade com definições para muitas interfaces públicas comuns do Visual Studio. Esse assembly contém definições gerenciadas para muitas interfaces do Visual Studio que se afastam de vários assemblies de interoperabilidade. O novo assembly de interoperabilidade é distribuído por meio do Microsoft.VisualStudio.Interop pacote NuGet.

No entanto, os componentes do Visual Studio que são usados principalmente em contextos nativos e têm um baixo número de alterações de quebra continuarão a ter seus próprios assemblies de interoperabilidade (por exemplo, o assembly do depurador ainda será VisualStudio.Debugger.Interop.dll como acontece hoje). Em qualquer caso, os assemblies podem ser referenciados a partir do seu aplicativo, assim como são hoje.

Essa é uma alteração significativa e significa que as extensões que usam APIs e assembly criado nessa nova abordagem não são compatíveis com versões mais antigas do Visual Studio usando o assembly de interoperabilidade anterior.

Isso tem algumas vantagens muito importantes que facilitarão a atualização de sua extensão para o Visual Studio 2022:

  • Quaisquer APIs quebradas se tornarão erros de tempo de compilação, tornando-os mais fáceis de encontrar e corrigir.
  • Você só precisa atualizar o código que usa uma API que foi quebrada no Visual Studio 2022.
  • Você não poderá usar acidentalmente a API antiga, agora quebrada.

No geral, essas alterações resultarão em uma versão mais estável do Visual Studio para todos os usuários. A principal desvantagem dessa abordagem é que seus assemblies gerenciados não poderão ser executados no Visual Studio 2019 e no Visual Studio 2022 sem compilar seu código uma vez para cada versão do Visual Studio de destino.

À medida que você trabalha com erros de compilação devido às diferenças de API entre o Visual Studio 2019 e o Visual Studio 2022, você pode encontrar a API ou o padrão que você está enfrentando listados abaixo com orientações sobre como corrigi-lo.

int ou uint onde IntPtr é esperado

Esperamos que este seja um erro muito comum. Para tornar o Visual Studio 2022 um processo de 64 bits, algumas de nossas APIs de interoperabilidade tiveram que ser corrigidas onde presumiam que um ponteiro poderia caber em um inteiro de 32 bits para realmente usar um valor do tamanho de um ponteiro.

Exemplo de erro:

Argumento 3: não é possível converter de 'out uint' para 'out System.IntPtr'

Basta atualizar seu código para esperar ou fornecer IntPtr ou onde int ou UIntPtr uint costumava estar para resolver a interrupção.

Exemplo de correção:

-shell.LoadLibrary(myGuid, myFlags, out uint ptrLib);
+shell.LoadLibrary(myGuid, myFlags, out IntPtr ptrLib);

Um tipo de interoperabilidade definido em dois assemblies

Quando o compilador C# relata um erro que um tipo que você está usando é definido em dois assemblies, você provavelmente está fazendo referência a um assembly da versão do Visual Studio 2019 do SDK que você não deve mais referenciar.

Exemplo de erro:

erro CS0433: O tipo 'IVsDpiAware' existe em 'Microsoft.VisualStudio.Interop, Version=17.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' e 'Microsoft.VisualStudio.Shell.Interop.16.0.DesignTime, Version=16.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a'

Consulte nossa tabela de remapeamento de assembly de referência para ver qual nome de assembly é o nome preferencial no Visual Studio 2022. Considerando os dois assemblies nomeados no erro de exemplo acima e observando esta tabela, observe que Microsoft.VisualStudio.Interop é o novo nome do assembly. A correção, então, seria remover a referência a Microsoft.VisualStudio.Shell.Interop.16.0.DesignTime do projeto.

Em alguns casos, oferecemos um pacote com versão do Visual Studio 2022 para o assembly preterido que contém encaminhadores de tipo. Quando isso estiver disponível, você terá a opção de atualizar sua referência de pacote para a versão do Visual Studio 2022 em vez de removê-la. Os encaminhadores de tipo resolverão o erro do compilador.

Tenha em mente que, às vezes, essas referências podem vir por referência de pacote transitivo e, portanto, podem ser mais difíceis de remover do que uma referência direta feita em seu arquivo de projeto. Nesses casos, verifique se todas as referências de pacote direto estão usando os próprios pacotes do SDK do Visual Studio 2022. Você pode consultar project.assets.json para identificar a cadeia de pacotes responsável por trazer o assembly preterido. Atualizar uma referência de pacote transitivo para uma versão do Visual Studio 2022 é tão fácil quanto instalá-la como uma referência direta.

Se você não puder alterar a árvore de dependência (por exemplo, porque envolve uma dependência de terceiros), poderá adicionar uma referência de pacote direto ao pacote anterior ao Visual Studio 2022 e adicionar ExcludeAssets="compile" metadados a esse PackageReference item para resolver o erro do compilador. Mas lembre-se de que, com essa técnica, sua extensão pode reter uma dependência de um assembly anterior ao Visual Studio 2022 e sua extensão pode funcionar mal em tempo de execução.

Referência ausente a um assembly de interoperabilidade

Quando você faz referência a um assembly que compilado em relação ao SDK anterior ao Visual Studio 2022, você pode obter um erro sobre a falta de uma referência de assembly.

Exemplo de erro:

Erro CS0012 O tipo 'IVsTextViewFilter' é definido em um assembly que não é referenciado. Você deve adicionar uma referência ao assembly 'Microsoft.VisualStudio.TextManager.Interop, Version=7.1.40304.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a'

Usando a tabela de remapeamento do assembly de referência, você pode confirmar se o assembly solicitado não é, de fato, um que você deve ter que referenciar.

A melhor correção é atualizar sua dependência para uma versão compilada no SDK do Visual Studio 2022 para que o assembly de interoperabilidade removido não seja mais solicitado pelo compilador.

Em alguns casos, oferecemos um pacote com versão do Visual Studio 2022 para o assembly preterido que contém encaminhadores de tipo. Quando isso estiver disponível, você tem a opção de adicionar uma referência de pacote à versão do Visual Studio 2022 do pacote obsoleto para que os encaminhadores de tipo resolvam o erro do compilador.

IAsyncServiceProvider está faltando

Há duas definições dessa interface, em dois namespaces. Apenas um deles era destinado ao consumo gerenciado.

Visual Studio 2019 Namespace Visual Studio 2022 Namespace Uso pretendido
Microsoft.VisualStudio.Shell.IAsyncServiceProvider Microsoft.VisualStudio.Shell.IAsyncServiceProvider Consumo de código gerenciado
Microsoft.VisualStudio.Shell.Interop.IAsyncServiceProvider Microsoft.VisualStudio.Shell.COMAsyncServiceProvider.IAsyncServiceProvider somente interoperabilidade de baixo nível

Se você vir um erro sobre IAsyncServiceProvider, pode ser que você estava usando o destinado ao código nativo (a segunda linha). Nesse caso, você pode atualizar para o novo namespace ou alternar para a interface mais amigável gerenciada.

DTE e _DTE falhas de conversão de tipo

DTE e _DTE são ambas interfaces. Um deriva do outro. No entanto, no Visual Studio 2022, os tipos base e derivados são trocados. Isso faz com que certas atribuições de tipo ou transmissões falhem.

Isso também significa que onde você costumava usar, agora você deve usar new DTE()new _DTE().

Para atenuar a maioria dos problemas com isso, use DTE2 a partir do EnvDTE80 namespace.

Argumento ausente em uma invocação de método

Alguns métodos não declaram mais argumentos padrão para o que eram parâmetros opcionais na API de interoperabilidade. Se você receber um erro sobre um argumento ausente para uma chamada de interoperabilidade COM e o parâmetro chamar um object tipo, o valor padrão anterior que a API de interoperabilidade do Visual Studio 2019 definiu pode ter sido "", portanto, considere adicionar "" como seu argumento para resolver o erro de compilação.

Em caso de dúvida sobre qual era o argumento padrão, tente alternar o contexto do serviço de idioma do Visual Studio 2022 para o Visual Studio 2019 para obter o Intellisense com os assemblies de interoperabilidade mais antigos para ver qual era o argumento padrão e, em seguida, adicioná-lo explicitamente ao seu código. Ele continuará a funcionar bem quando compilado para o Visual Studio 2019, mas agora será compilado para o Visual Studio 2022.

Exemplo de correção:

-process4.Attach2();
+process4.Attach2("");

Substituição da API de Localização Legada

Como parte de nossos esforços para modernizar a localização em arquivos, substituímos o suporte às seguintes APIs da interface EnvDTE no VS 2022.

Essas APIs não funcionarão mais no VS 2022 e além. A orientação é usar IFinder Interface (Microsoft.VisualStudio.Text.Operations) em vez disso, que tem métodos de localização e substituição nele. O acesso a um objeto que implementa a interface IFinder pode ser obtido por meio do método IFindService.CreateFinderFactory. Um exemplo de migração de uma extensão de terceiros para o Visual Studio das APIs mais antigas para as APIs IFinder modernas pode ser encontrado aqui: Migrar a extensão Code Maid do EnvDTE Localizar e substituir APIs de padrão para APIs IFinder modernas