Compartir a través de


Cambios importantes en la API en Visual Studio 2022

Si va a migrar una extensión a Visual Studio 2022, los cambios importantes que se enumeran aquí pueden afectarle.

Los ensamblados de referencia ya no están instalados

Muchos de los ensamblados que puede haber estado haciendo referencia a que MSBuild resuelto desde un directorio de instalación de Visual Studio ya no están instalados. Debe usar NuGet para adquirir los ensamblados ref del SDK de Visual Studio que necesita. Consulte Modernización de proyectos para obtener pasos detallados sobre cómo hacerlo.

API eliminadas

En Visual Studio 2022 se han quitado varias API como parte de la migración de Visual Studio en el futuro. Puede encontrar una lista de las API eliminadas en la página Lista de API eliminadas.

Cambios importantes en la interoperabilidad

Muchas de nuestras API han cambiado en Visual Studio 2022, normalmente con cambios sencillos que son sencillos para que el código se adapte.

Para administrar los cambios importantes, planeamos proporcionar un nuevo mecanismo para la distribución de ensamblados de interoperabilidad. En concreto, para Visual Studio 2022 y versiones posteriores se proporciona un único ensamblado de interoperabilidad con definiciones para muchas interfaces comunes de Visual Studio públicas. Ese ensamblado contiene definiciones administradas para muchas interfaces de Visual Studio que se alejan de varios ensamblados de interoperabilidad. El nuevo ensamblado de interoperabilidad se distribuye a través del Microsoft.VisualStudio.Interop paquete NuGet.

Sin embargo, los componentes de Visual Studio que se usan principalmente en contextos nativos y que tienen un número bajo de cambios importantes seguirán teniendo sus propios ensamblados de interoperabilidad (por ejemplo, el ensamblado del depurador seguirá siendo VisualStudio.Debugger.Interop.dll como lo hace hoy). En cualquier caso, se puede hacer referencia a los ensamblados desde la aplicación, tal como están actualmente.

Se trata de un cambio significativo y significa que las extensiones que usan API en y ensamblado integrados en este nuevo enfoque no son compatibles con versiones anteriores de Visual Studio mediante el ensamblado de interoperabilidad anterior.

Esto tiene algunas ventajas muy importantes que facilitarán la actualización de la extensión a Visual Studio 2022:

  • Las API interrumpidas se convertirán en errores de tiempo de compilación, lo que facilita la búsqueda y corrección.
  • Solo tiene que actualizar el código que usa una API que se ha interrumpido en Visual Studio 2022.
  • No podrá usar accidentalmente la API antigua y ahora interrumpida.

En general, estos cambios darán lugar a una versión más estable de Visual Studio para todos los usuarios. El principal inconveniente de este enfoque es que los ensamblados administrados no podrán ejecutarse en Visual Studio 2019 y Visual Studio 2022 sin compilar el código una vez para cada versión de Visual Studio de destino.

A medida que trabaje con errores de compilación debido a las diferencias de API entre Visual Studio 2019 y Visual Studio 2022, puede encontrar la API o el patrón al que se enfrenta a continuación con instrucciones sobre cómo corregirlo.

int o dónde uint IntPtr se espera

Esperamos que esto sea un error muy común. Para que Visual Studio 2022 sea un proceso de 64 bits, algunas de nuestras API de interoperabilidad tenían que corregirse donde se supone que un puntero podría caber en un entero de 32 bits para usar realmente un valor de tamaño de puntero.

Error de ejemplo:

Argumento 3: no se puede convertir de 'out uint' a 'out System.IntPtr'

Basta con actualizar el código para esperar o proporcionar IntPtr o UIntPtr dónde int o uint usar para resolver la interrupción.

Corrección de ejemplo:

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

Un tipo de interoperabilidad definido en dos ensamblados

Cuando el compilador de C# notifica un error que indica que un tipo que está usando se define en dos ensamblados, probablemente esté haciendo referencia a un ensamblado desde la versión de Visual Studio 2019 del SDK al que ya no debería hacer referencia.

Error de ejemplo:

error CS0433: el tipo "IVsDpiAware" existe en "Microsoft.VisualStudio.Interop", Version=17.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' y 'Microsoft.VisualStudio.Shell.Interop.16.0.DesignTime, Version=16.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a'

Consulte nuestra tabla de reasignación de ensamblados de referencia para ver qué nombre de ensamblado es el nombre preferido en Visual Studio 2022. Teniendo en cuenta los dos ensamblados denominados en el error de ejemplo anterior y examinando esta tabla, observe que Microsoft.VisualStudio.Interop es el nuevo nombre del ensamblado. A continuación, la corrección sería quitar la referencia a Microsoft.VisualStudio.Shell.Interop.16.0.DesignTime del proyecto.

En algunos casos, ofrecemos un paquete con versiones de Visual Studio 2022 para el ensamblado en desuso que contiene reenviadores de tipos. Cuando esté disponible, tiene la opción de actualizar la referencia del paquete a la versión de Visual Studio 2022 en lugar de quitarlo. Los reenviadores de tipos resolverán el error del compilador.

Tenga en cuenta que a veces estas referencias pueden venir por referencia de paquete transitiva y, por tanto, puede ser más difícil quitar que una referencia directa realizada en el archivo de proyecto. En tales casos, asegúrese de que todas las referencias de paquete directo usan paquetes del SDK de Visual Studio 2022. Puede hacer referencia a project.assets.json para identificar la cadena de paquetes responsable de incorporar el ensamblado en desuso. Actualizar una referencia de paquete transitivo a una versión de Visual Studio 2022 es tan fácil como instalarlo como referencia directa.

Si no puede cambiar el árbol de dependencias (por ejemplo, porque implica una dependencia de terceros), puede agregar una referencia de paquete directo al paquete anterior a Visual Studio 2022 y agregar ExcludeAssets="compile" metadatos a ese PackageReference elemento para resolver el error del compilador. Pero tenga en cuenta que, con esta técnica, la extensión puede conservar una dependencia de un ensamblado anterior a Visual Studio 2022 y la extensión puede funcionar mal en tiempo de ejecución.

Falta referencia a un ensamblado de interoperabilidad

Al hacer referencia a un ensamblado compilado con el SDK anterior a Visual Studio 2022, puede obtener un error sobre la falta de una referencia de ensamblado.

Error de ejemplo:

Error CS0012 El tipo "IVsTextViewFilter" se define en un ensamblado al que no se hace referencia. Debe agregar una referencia al ensamblado 'Microsoft.VisualStudio.TextManager.Interop, Version=7.1.40304.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a'

Con la tabla de reasignación de ensamblados de referencia, puede confirmar que el ensamblado solicitado no es de hecho uno al que debe hacer referencia.

La mejor corrección es actualizar la dependencia a una versión que se compiló con el SDK de Visual Studio 2022 para que el compilador deje de solicitar el ensamblado de interoperabilidad quitado.

En algunos casos, ofrecemos un paquete con versiones de Visual Studio 2022 para el ensamblado en desuso que contiene reenviadores de tipos. Cuando esté disponible, tiene la opción de agregar una referencia de paquete a la versión de Visual Studio 2022 del paquete obsoleto para que los reenviadores de tipos resuelvan el error del compilador.

IAsyncServiceProvider falta

Hay dos definiciones de esta interfaz, en dos espacios de nombres. Solo uno de ellos estaba pensado para el consumo administrado.

Espacio de nombres de Visual Studio 2019 Espacio de nombres de Visual Studio 2022 Uso previsto
Microsoft.VisualStudio.Shell.IAsyncServiceProvider Microsoft.VisualStudio.Shell.IAsyncServiceProvider Consumo de código administrado
Microsoft.VisualStudio.Shell.Interop.IAsyncServiceProvider Microsoft.VisualStudio.Shell.COMAsyncServiceProvider.IAsyncServiceProvider interoperabilidad de bajo nivel solo

Si ve un error sobre IAsyncServiceProvider, puede ser que estaba usando el diseñado para el código nativo (la segunda fila). Si es así, puede actualizar al nuevo espacio de nombres o cambiar a la interfaz más fácil de administrar.

DTEerrores de conversión de tipos y _DTE

DTE y _DTE son ambas interfaces. Una deriva de la otra. Sin embargo, en Visual Studio 2022, se intercambian los tipos base y derivados. Esto hace que se produzcan errores en determinadas asignaciones de tipos o conversiones.

Esto también significa dónde usó para usar new DTE(), ahora debe usar new _DTE().

Para mitigar la mayoría de los problemas con esto, use DTE2 desde el EnvDTE80 espacio de nombres en su lugar.

Falta el argumento en una invocación de método

Algunos métodos ya no declaran argumentos predeterminados para los parámetros opcionales en la API de interoperabilidad. Si recibe un error sobre un argumento que falta para una llamada de interoperabilidad COM y el parámetro llama a un object tipo, el valor predeterminado anterior que puede haber ""definido la API de interoperabilidad de Visual Studio 2019, por lo que considere la posibilidad de agregar "" como argumento para resolver el error de compilación.

Cuando se duda de cuál era el argumento predeterminado, intente cambiar el contexto del servicio de lenguaje de Visual Studio 2022 a Visual Studio 2019 para obtener IntelliSense con los ensamblados de interoperabilidad anteriores para ver cuál era el argumento predeterminado y, a continuación, agregarlo explícitamente al código. Seguirá funcionando bien cuando se compile para Visual Studio 2019, pero ahora se compilará para Visual Studio 2022.

Corrección de ejemplo:

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

Desuso de la API de búsqueda heredada

Como parte de nuestros esfuerzos para modernizar la búsqueda en archivos, hemos dejado de usar la compatibilidad con las siguientes API de la interfaz EnvDTE en VS 2022.

Estas API ya no funcionarán en VS 2022 ni en versiones posteriores. La guía consiste en usar IFinder Interface (Microsoft.VisualStudio.Text.Operations) en su lugar, que tiene métodos de búsqueda y reemplazo en él. El acceso a un objeto que implementa la interfaz IFinder se puede obtener a través del método IFindService.CreateFinderFactory. Aquí se puede encontrar un ejemplo de migración de una extensión de terceros a Visual Studio desde las API anteriores a las API de IFinder modernas: Migración de la extensión De limpieza de código desde las API de patrón Find y Replace de EnvDTE a las API de IFinder modernas