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 tanto en Visual Studio 2019 como en Visual Studio 2022 con cambios menores que no requerirán seguir los consejos para modernizar tu extensión de 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. De este modo, la extensión podrá estar lista para que los usuarios la instalen antes de que Visual Studio 2022 alcance la disponibilidad general.
Instalación de Visual Studio y compilación de extensiones
Instalación de 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:
- El metapaquete Microsoft.VisualStudio.Sdk (versiones 17.x) incluye la mayoría o todos los ensamblados de referencia que necesitará.
- Se debe hacer referencia al paquete Microsoft.VSSDK.BuildTools (versiones 17.x) desde el proyecto VSIX para poder compilar un VSIX compatible con Visual Studio 2022.
Aunque no haga 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.
Aunque no haga 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:
- Modernice sus proyectos.
- Refactorice el código fuente en un proyecto compartido para permitir el destino de Visual Studio 2022 y versiones anteriores.
- Agregue un proyecto VSIX destinado a Visual Studio 2022 y una tabla de reasignación de paquetes o ensamblados.
- Realice los ajustes de código necesarios.
- Pruebe la extensión de Visual Studio 2022.
- 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 proyectos o elementos) no están obligadas a seguir los pasos anteriores, incluida la producción de dos VSIX distintos.
En su lugar, modifique el VSIX para que su archivo source.extension.vsixmanifest
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 de su proyectos de VSIX
Antes de agregar compatibilidad con Visual Studio 2022 a la extensión, se recomienda encarecidamente limpiar y modernizar el proyecto existente:
Reemplace las referencias directas del ensamblado del SDK de Visual Studio por elementos
PackageReference
:-<Reference Include="Microsoft.VisualStudio.OLE.Interop" /> +<PackageReference Include="Microsoft.VisualStudio.OLE.Interop" Version="..." />
Sugerencia
Puede reemplazar muchas referencias de ensamblado por solo una instancia de
PackageReference
para el 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 a <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 el 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. Revise estas advertencias y resuelva todas las que pueda. Considere la posibilidad de usar regiones #pragma warning disable <id>
en código 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 se 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, le recomendamos que utilice proyectos compartidos para adaptar su 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 instancia de source.extension.vsixmanifest
y el paquete hace referencia al SDK 16.x o al SDK 17.x. Estos proyectos de 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:
Si aún no lo ha hecho, modernice los proyectos para facilitar los pasos posteriores en este proceso de actualización.
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.
En el cuadro de diálogo Agregar un nuevo proyecto, busque proyecto compartido y, a continuación, seleccione la plantilla Proyecto compartido.
Agregue una referencia de cada proyecto de referencia del SDK de Visual Studio a su homólogo de proyecto compartido.
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.
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.
Para los archivos de metadatos, establezca Acción de compilación en Contenido. Establezca Incluir en VSIX en True.
Para los archivos VSCT, establezca Acción de compilación en VSCTCompile. Establezca Incluir en VSIX en False.
Si Visual Studio indica que no se admite esta configuración, puede cambiar manualmente la acción de compilación descargando el proyecto y cambiando
Content
aVSCTCompile
:-<Content Include="..\SharedFiles\VSIXProject1Package.vsct"> - <Link>VSIXProject1Package.vsct</Link> -</Content> +<VSCTCompile Include="..\SharedFiles\VSIXProject1Package.vsct"> + <Link>VSIXProject1Package.vsct</Link> + <ResourceName>Menus.ctmenu</ResourceName> +</VSCTCompile>
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 siguiendo los pasos siguientes. Puede completarlos con Visual Studio 2019.
Agregue un proyecto VSIX nuevo a la solución. Este proyecto tendrá como destino Visual Studio 2022. Quite cualquier código fuente que se incluya con la plantilla, pero mantenga el archivo source.extension.vsixmanifest.
En el nuevo proyecto VSIX, agregue una referencia al mismo proyecto compartido al que hace referencia VSIX de destino de Visual Studio 2019.
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.
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 que estén 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.
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 cargue en un proceso de 64 bits. Cualquier CPU también está bien, pero podría generar advertencias si hace referencia a archivos binarios nativos solo de x64.
Cualquier dependencia que la extensión pueda tener de un módulo nativo tendrá que actualizarse de una imagen x86 a una imagen AMD64.
Edite el archivo source.extension.vsixmanifest para reflejar que el destino es Visual Studio 2022. Configure la etiqueta
<InstallationTarget>
para que indique Visual Studio 2022. Configure el elementoProductArchitecture
para que indique una carga de 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 elemento
ProductArchitecture
. 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 elemento
ProductArchitecture
es crítico. Visual Studio 2022 no instalará la extensión sin él.Elemento Valor 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 instancia de InstallationTarget
. Para las versiones de producto inferiores a 17.0, el valor predeterminado esx86
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 esamd64
.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 elemento
Identity
del manifiesto es diferente para cada extensión.
En este momento, tiene un VSIX de extensión con Visual Studio 2022 como destino. Debe compilar el proyecto VSIX de destino de Visual Studio 2022 y trabajar con cualquier interrupción de compilación que aparezca. Si no tiene interrupciones de compilación en el proyecto VSIX de destino de Visual Studio 2022, enhorabuena. Ya está listo para realizar las 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:
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 regiones #if
. El fragmento 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 #if
, observe cómo puede usar la lista desplegable del contexto del servicio de lenguaje para cambiar el 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.
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. Puede que tenga 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 la admire.
Visual Studio Marketplace
Publicar su extensión en Visual Studio Marketplace es una buena forma de conseguir que nuevos usuarios encuentren e instalen su extensión. Tanto si la extensión tiene como destino Visual Studio 2022 exclusivamente o versiones anteriores de Visual Studio, Marketplace está ahí para ayudarle.
En el futuro, Marketplace le permitirá cargar varios VSIX en una sola lista de Marketplace. Después, puede cargar VSIX destinado a 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 de 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 su VSIX especifica otros VSIX como dependencias a través del elemento <dependency>
, 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 el suyo, 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í. Consulte Extensiones sin código en ejecución para obtener información al respecto.
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.
Contenido relacionado
Siga un ejemplo paso a paso, ImageOptimizer, con vínculos al proyecto y cambios de código para cada paso.