Actualización de una extensión de Visual Studio para Visual Studio 2022

Importante

El consejo de este artículo puede guiar a los desarrolladores en la migración de extensiones que requieren cambios importantes para trabajar tanto en Visual Studio 2019 como en Visual Studio 2022. En esos casos, se recomienda tener dos proyectos VSIX y compilación condicional.

Muchas extensiones funcionarán en Visual Studio 2019 y Visual Studio 2022 con cambios menores que no requerirán seguir los consejos para modernizar la extensión en este artículo. Pruebe la extensión en Visual Studio 2022 y evalúe qué opción es la mejor para la extensión.

Visual Studio 2022 es una aplicación de 64 bits y presenta algunos cambios importantes en el SDK de Visual Studio. Este artículo le guía por los pasos necesarios para que la extensión funcione con la versión preliminar actual de Visual Studio 2022. La extensión puede estar lista para que los usuarios se instalen antes de que Visual Studio 2022 alcance la disponibilidad general.

Instalar Visual Studio y compilar extensiones

Instale Visual Studio 2022 desde descargas de Visual Studio 2022.

Extensiones escritas en un lenguaje .NET

El SDK de Visual Studio que tiene como destino Visual Studio 2022 para extensiones administradas se encuentra exclusivamente en NuGet:

Incluso si no hace referencia a ningún cambio importante, las extensiones deben compilarse con la plataforma Any CPU o x64 . La plataforma x86 no es compatible con el proceso de 64 bits en Visual Studio 2022.

Extensiones escritas en C++

El SDK de Visual Studio para extensiones compiladas con C++ está disponible con el SDK de Visual Studio instalado, como de costumbre.

Incluso si no hace referencia a ningún cambio importante, las extensiones deben compilarse específicamente en el SDK de Visual Studio 2022 y para AMD64.

Extensiones con código en ejecución

Las extensiones con código en ejecución deben compilarse específicamente para Visual Studio 2022. Visual Studio 2022 no cargará ninguna extensión destinada a una versión anterior de Visual Studio.

Obtenga información sobre cómo migrar las extensiones para versiones anteriores de Visual Studio a Visual Studio 2022:

  1. Modernice los proyectos.
  2. Refactorice el código fuente en un proyecto compartido para permitir el destino de Visual Studio 2022 y versiones anteriores.
  3. Agregue un proyecto VSIX de destino de Visual Studio 2022 y una tabla de reasignación de paquetes o ensamblados.
  4. Realice los ajustes de código necesarios.
  5. Pruebe la extensión de Visual Studio 2022.
  6. Publique la extensión de Visual Studio 2022.

Extensiones sin código en ejecución

Las extensiones que no contienen ningún código en ejecución (por ejemplo, plantillas de proyecto o elemento) no son necesarias para seguir los pasos anteriores, incluida la producción de dos VSIX distintos.

En su lugar, modifique el vsix para que su source.extension.vsixmanifest archivo declare dos destinos de instalación:

<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>

Puede omitir los pasos de este artículo sobre el uso de proyectos compartidos y varios VSIX. Puede continuar con las pruebas.

Nota:

Si va a crear una nueva extensión de Visual Studio con Visual Studio 2022 y también quiere tener como destino Visual Studio 2019 o una versión anterior, consulte esta guía.

tareas de MSBuild

Si crea tareas de MSBuild, tenga en cuenta que en Visual Studio 2022, es probable que se carguen en un proceso de MSBuild.exe de 64 bits. Si la tarea requiere que se ejecute un proceso de 32 bits, consulte Configuración de destinos y tareas para asegurarse de que MSBuild carga la tarea en un proceso de 32 bits.

Modernización del proyecto VSIX

Antes de agregar compatibilidad con Visual Studio 2022 a la extensión, se recomienda encarecidamente limpiar y modernizar el proyecto existente:

  1. Migre de packages.config a PackageReference.

  2. Reemplace las referencias directas del ensamblado del SDK de Visual Studio por PackageReference elementos:

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

    Sugerencia

    Puede reemplazar muchas referencias de ensamblado por solo unaPackageReference instancia del metapaquete:

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

    Asegúrese de elegir las versiones del paquete que coincidan con la versión mínima de Visual Studio que tiene como destino.

Algunos ensamblados que no son exclusivos del SDK de Visual Studio (por ejemplo, Newtonsoft.Json.dll) podrían haberse detectado a través de una referencia simple <Reference Include="Newtonsoft.Json" /> antes de Visual Studio 2022. Pero en Visual Studio 2022, requieren una referencia de paquete en su lugar. La razón es que algunos directorios de tiempo de ejecución y SDK de Visual Studio se han quitado de la ruta de búsqueda de ensamblado predeterminada en MSBuild.

Al cambiar de referencias directas de ensamblado a referencias de paquete NuGet, es posible que seleccione referencias de ensamblado adicionales y paquetes de analizador porque NuGet instala automáticamente el cierre transitivo de dependencias. Esto suele ser correcto, pero podría dar lugar a advertencias adicionales durante la compilación. Trabaje con estas advertencias y resuelva tanto como pueda. Considere la posibilidad de usar regiones en código #pragma warning disable <id> para suprimir advertencias que no se pueden resolver.

Uso de proyectos compartidos para varios destinos

Los proyectos compartidos son un tipo de proyecto que se introdujo en Visual Studio 2015. Los proyectos compartidos en Visual Studio permiten que los archivos de código fuente se compartan entre varios proyectos y compilen de forma diferente mediante símbolos de compilación condicional y conjuntos únicos de referencias.

Visual Studio 2022 requiere un conjunto distinto de ensamblados de referencia de todas las versiones anteriores de Visual Studio. Por lo tanto, se recomienda usar proyectos compartidos para tener como destino convenientemente la extensión a Visual Studio 2022, versiones anteriores y versiones posteriores. Esta técnica le proporcionará código compartido pero referencias distintas.

En el contexto de las extensiones de Visual Studio, podría tener un proyecto VSIX para Visual Studio 2022 y versiones posteriores, y un proyecto VSIX para Visual Studio 2019 y versiones anteriores. Cada uno de estos proyectos contendrá solo una source.extension.vsixmanifest instancia y el paquete hace referencia al SDK 16.x o al SDK 17.x. Estos proyectos VSIX también tendrían una referencia de proyecto compartido a un nuevo proyecto compartido que hospedará todo el código fuente que se puede compartir entre las dos versiones de Visual Studio.

En esta sección se supone que ya tiene un proyecto VSIX destinado a Visual Studio 2019 y que desea que la extensión funcione en Visual Studio 2022.

Puede completar todos estos pasos mediante Visual Studio 2019:

  1. Si aún no lo ha hecho, modernice los proyectos para facilitar los pasos posteriores en este proceso de actualización.

  2. Agregue un nuevo proyecto compartido a la solución para cada proyecto existente que haga referencia al SDK de Visual Studio. Haga clic con el botón derecho en la solución y seleccione Agregar>nuevo proyecto.

    Screenshot that shows the selections for adding a new project.

  3. En el cuadro de diálogo Agregar un nuevo proyecto , busque proyecto compartido y, a continuación, seleccione la plantilla Proyecto compartido.

    Screenshot that shows searching for and selecting the Shared Project template.

  4. Agregue una referencia de cada proyecto de referencia del SDK de Visual Studio a su homólogo de proyecto compartido.

    Screenshot that shows selections for adding a shared project reference.

  5. Mueva todo el código fuente (incluidos los archivos .cs y .resx ) de cada proyecto de referencia del SDK de Visual Studio a su homólogo de proyecto compartido. Deje el archivo source.extension.vsixmanifest en el proyecto VSIX.

    Screenshot that shows a shared project containing all source files.

  6. Mueva archivos de metadatos (por ejemplo, notas de la versión, licencia e iconos) y archivos VSCT a un directorio compartido. A continuación, agréguelos como archivos vinculados al proyecto VSIX. Tenga en cuenta que el directorio compartido es independiente del proyecto compartido.

    Screenshot that shows selections for adding metadata and V S C T files as linked files.

    • Para los archivos de metadatos, establezca Acción de compilación en Contenido. Establezca Include in VSIX (Incluir en VSIX ) en True.

      Screenshot that shows including metadata files in V S I X.

    • Para los archivos VSCT, establezca Acción de compilación en VSCTCompile. Establezca Include in VSIX (Incluir en VSIX ) en False.

      Screenshot that shows selected properties for a V S C T file.

      Si Visual Studio se queja de que no se admite esta configuración, puede cambiar manualmente la acción de compilación descargando el proyecto y cambiando Content a 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. Compile el proyecto para confirmar que no ha introducido ningún error.

El proyecto ya está listo para agregar compatibilidad con Visual Studio 2022.

Adición de un destino de Visual Studio 2022

En esta sección se supone que ha completado los pasos para factorizar la extensión de Visual Studio con proyectos compartidos.

Agregue compatibilidad con Visual Studio 2022 a la extensión mediante los pasos siguientes. Puede completarlos con Visual Studio 2019.

  1. Agregue un proyecto VSIX nuevo a la solución. Este proyecto tendrá como destino Visual Studio 2022. Quite cualquier código fuente que se incluye con la plantilla, pero mantenga el archivo source.extension.vsixmanifest .

  2. En el nuevo proyecto VSIX, agregue una referencia al mismo proyecto compartido al que hace referencia VSIX de Destino de Visual Studio 2019.

    Screenshot that shows a solution with one shared project and two V S I X projects.

  3. Compruebe que el nuevo proyecto VSIX se compila correctamente. Es posible que tenga que agregar referencias para que coincidan con el proyecto VSIX original para resolver los errores del compilador.

  4. Para las extensiones administradas de Visual Studio, actualice las referencias del paquete de 16.x (o anteriores) a las versiones de paquete 17.x en el archivo de proyecto de destino de Visual Studio 2022. Use el Administrador de paquetes nuGet o edite directamente el archivo del proyecto:

    -<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" />
    

    Las versiones que se muestran en el código anterior son solo para demostración. En el código, use versiones disponibles en el sitio web de NuGet.

    En muchos casos, los identificadores de paquete han cambiado. Para obtener una lista de los cambios en Visual Studio 2022, consulte la tabla de asignación de paquetes o ensamblados.

    Las extensiones escritas en C++ aún no tienen un SDK disponible con el que compilar.

  5. En el caso de los proyectos de C++, las extensiones deben compilarse para AMD64. En el caso de las extensiones administradas, considere la posibilidad de cambiar el proyecto de la compilación de Cualquier CPU a x64 como destino. Ese cambio garantiza que, en Visual Studio 2022, la extensión siempre se carga en un proceso de 64 bits. Cualquier CPU también está bien, pero podría generar advertencias si hace referencia a archivos binarios nativos x64 solo.

    Cualquier dependencia que pueda tener la extensión en un módulo nativo tendrá que actualizarse desde una imagen x86 a una imagen AMD64.

  6. Edite el archivo source.extension.vsixmanifest para reflejar el destino visual Studio 2022. Establezca la <InstallationTarget> etiqueta para indicar Visual Studio 2022. Establezca el ProductArchitecture elemento para indicar una carga AMD64.

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

    Importante

    En Visual Studio 2019, el diseñador de este archivo no expone el nuevo ProductArchitecture elemento. Debe usar un editor XML para realizar este cambio. Para acceder al editor XML, vaya a Explorador de soluciones y seleccione el comando Abrir con.

    El ProductArchitecture elemento es crítico. Visual Studio 2022 no instalará la extensión sin ella.

    Elemento Value Descripción
    ProductArchitecture x86, amd64 Las plataformas que admite este VSIX. No distingue mayúsculas de minúsculas. Use una plataforma por elemento y un elemento por InstallationTarget instancia. Para las versiones de producto inferiores a 17.0, el valor predeterminado es x86 y se puede omitir. Para las versiones 17.0 y posteriores del producto, este elemento es necesario y no hay ningún valor predeterminado. Para Visual Studio 2022, el único contenido válido para este elemento es amd64.
  7. Realice cualquier otro ajuste necesario en source.extension.vsixmanifest para que coincida con el que tiene como destino Visual Studio 2019 (si existe).

    Si va a publicar dos versiones de la extensión que tienen como destino una versión diferente de Visual Studio, asegúrese de que el identificador de VSIX en el Identity elemento del manifiesto es diferente para cada extensión.

En este momento, tiene una extensión dirigida a Visual Studio 2022 VSIX. Debe compilar el proyecto VSIX de destino de Visual Studio 2022 y trabajar con cualquier salto de compilación que aparezca. Si no tiene interrupciones de compilación en el proyecto VSIX de destino de Visual Studio 2022, enhorabuena. Está listo para realizar pruebas.

Control de cambios importantes en la API

Los cambios importantes en la API pueden requerir actualizaciones en el código que se ejecutó en versiones anteriores de Visual Studio. Para obtener sugerencias sobre cómo actualizar el código, consulte Cambios importantes de la API en Visual Studio 2022.

Al adaptar el código, se recomienda usar la compilación condicional. Después, el código puede seguir admitiendo versiones anteriores de Visual Studio al agregar compatibilidad con Visual Studio 2022.

Cuando obtenga la compilación de la extensión de destino de Visual Studio 2022, continúe con las pruebas.

Uso de símbolos de compilación condicional

Si desea usar el mismo código fuente, incluso el mismo archivo, para Visual Studio 2022 y versiones anteriores, es posible que tenga que usar la compilación condicional. A continuación, puede bifurcar el código para adaptarse a los cambios importantes. La compilación condicional es una característica de los lenguajes C#, Visual Basic y C++. Se puede usar para compartir la mayoría del código, al tiempo que se adapta a las API divergentes en lugares específicos.

Para obtener más información sobre el uso de directivas de preprocesador y símbolos de compilación condicional, consulte Directivas de preprocesador de C#.

Los proyectos que tienen como destino versiones anteriores de Visual Studio necesitarán un símbolo de compilación condicional. A continuación, este símbolo se puede usar para bifurcar el código para usar las distintas API. Puede establecer el símbolo de compilación condicional en la página de propiedades del proyecto:

Screenshot that shows the box for entering a conditional compilation symbol.

Asegúrese de establecer el símbolo de compilación para Todas las configuraciones. De forma predeterminada, el símbolo que escriba puede aplicarse solo a una configuración.

Técnicas de C#

Puede usar el símbolo de compilación como una directiva de preprocesador (#if), como se muestra en el código siguiente. A continuación, puede bifurcar el código para tratar un cambio importante entre las versiones de 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

En algunos casos, puede usar var para evitar asignar un nombre al tipo y evitar la necesidad de #if regiones. El fragmento de código anterior también se puede escribir 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);

Cuando use la sintaxis, observe cómo puede usar la lista desplegable del contexto del servicio de lenguaje para cambiar el #if resaltado de sintaxis. La otra lista desplegable ayuda al servicio de lenguaje a centrar la atención en una versión de Visual Studio de destino para esta extensión frente a otra.

Screenshot that shows conditional compilation in a shared project.

Técnicas de uso compartido de XAML

XAML no tiene preprocesador para permitir la personalización del contenido en función de los símbolos del preprocesador. Es posible que tengas que copiar y mantener dos páginas XAML cuyo contenido difiere entre Visual Studio 2022 y versiones anteriores.

En algunos casos, es posible que una referencia a un tipo que exista en ensamblados distintos en Visual Studio 2022 y versiones anteriores todavía se pueda representar en un archivo XAML. Quite el espacio de nombres que hace referencia al ensamblado:

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

Prueba de la extensión

Para probar una extensión destinada a Visual Studio 2022, debe tener instalado Visual Studio 2022. No podrá ejecutar extensiones de 64 bits en versiones anteriores de Visual Studio.

Puede usar Visual Studio 2022 para compilar y probar las extensiones si tienen como destino Visual Studio 2022 o una versión anterior. Al abrir un proyecto VSIX desde Visual Studio 2022, se abre una instancia experimental de Visual Studio.

Se recomienda encarecidamente probar con cada versión de Visual Studio que quiera que admita la extensión.

Publicación de la extensión

Ha agregado un destino de Visual Studio 2022 a la extensión y lo ha probado. Ahora está listo para publicar la extensión para que el mundo lo admira.

Visual Studio Marketplace

Publicar la extensión en Visual Studio Marketplace es una excelente manera de obtener nuevos usuarios para buscar e instalar la extensión. Tanto si la extensión tiene como destino Visual Studio 2022 exclusivamente como destino las versiones anteriores de Visual Studio, Marketplace también le admite.

En el futuro, Marketplace le permitirá cargar varios VSIX en una sola lista de Marketplace. Después, puede cargar VSIX de destino de Visual Studio 2022 y VSIX para una versión anterior de Visual Studio. Los usuarios obtendrán automáticamente el VSIX adecuado para la versión de Visual Studio que han instalado, cuando usen el administrador de extensiones de Visual Studio.

Instalador personalizado

Si compila un archivo MSI o EXE para instalar la extensión y generar vsixinstaller.exe para instalar (parte de) la extensión, sepa que se ha actualizado el instalador de VSIX en Visual Studio 2022. Los desarrolladores deben usar la versión del instalador VSIX que viene con Visual Studio 2022 para instalar extensiones en esa versión de Visual Studio.

El instalador VSIX de Visual Studio 2022 también instala extensiones aplicables destinadas a versiones anteriores de Visual Studio que existen con Visual Studio 2022 en la misma máquina.

Recurso compartido de red

Puede compartir la extensión a través de una LAN o cualquier otra manera. Si tiene como destino Visual Studio 2022 y versiones anteriores, debe compartir sus varios VSIX individualmente. Asígneles nombres de archivo (o colóquelos en carpetas únicas) que ayuden a los usuarios a saber qué VSIX instalar en función de la versión de Visual Studio que han instalado.

Dependencias

Si VSIX especifica otros VSIX como dependencias a través del <dependency> elemento , cada VSIX al que se hace referencia debe instalarse en los mismos destinos y arquitecturas de producto que vsix. Si un VSIX dependiente no admite la instalación de destino de Visual Studio, se producirá un error en VSIX.

Es correcto que el VSIX dependiente admita más destinos y arquitecturas que los suyos, pero no menos. Esta restricción significa que el enfoque de implementación y distribución de un VSIX con dependencias debe reflejar el de sus dependientes.

Preguntas y respuestas

P: Mi extensión no requiere ningún cambio de interoperabilidad porque solo proporciona datos (por ejemplo, plantillas). ¿Puedo crear una sola extensión que también incluya Visual Studio 2022?

R: Sí. Consulta Extensiones sin ejecutar código para obtener información sobre esto.

P: Una dependencia de NuGet está incorporando ensamblados de interoperabilidad antiguos y causando clases en conflicto. ¿Cuál debo hacer?

R: Agregue la siguiente línea al archivo .csproj para evitar ensamblados duplicados:

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

Este código impedirá que las referencias de paquete importen la versión anterior del ensamblado desde otras dependencias.

P: Mis comandos y teclas de acceso rápido dejaron de funcionar en Visual Studio después de cambiar mis archivos de origen a un proyecto compartido. ¿Cuál debo hacer?

R: El paso 2.4 del ejemplo del optimizador de imágenes muestra cómo agregar archivos VSCT como elementos vinculados para que se compilen en el archivo VSCT.

Siga un ejemplo paso a paso, ImageOptimizer, con vínculos al proyecto y cambios de código para cada paso.