Mettre à jour une extension Visual Studio pour Visual Studio 2022

Important

Les conseils de cet article peuvent guider les développeurs dans la migration d’extensions qui nécessitent des modifications majeures pour fonctionner dans Visual Studio 2019 et Visual Studio 2022. Dans ce cas, nous vous recommandons d’avoir deux projets VSIX et une compilation conditionnelle.

De nombreuses extensions fonctionnent à la fois dans Visual Studio 2019 et Visual Studio 2022 avec des modifications mineures qui ne nécessitent pas de suivre les conseils sur la modernisation de votre extension dans cet article. Essayez votre extension dans Visual Studio 2022 et évaluez l’option la mieux adaptée à votre extension.

Visual Studio 2022 est une application 64 bits et introduit des changements cassants dans le Kit de développement logiciel (SDK) Visual Studio. Cet article vous guide tout au long des étapes nécessaires pour que votre extension fonctionne avec la préversion actuelle de Visual Studio 2022. Votre extension peut ensuite être prête pour les utilisateurs à installer avant que Visual Studio 2022 atteigne la disponibilité générale.

Installer Visual Studio et compiler des extensions

Installez Visual Studio 2022 à partir des téléchargements Visual Studio 2022.

Extensions écrites dans un langage .NET

Le Kit de développement logiciel (SDK) Visual Studio qui cible Visual Studio 2022 pour les extensions managées est exclusivement sur NuGet :

Même si vous ne référencez aucune modification cassante, les extensions doivent être compilées avec la plateforme Any CPU ou x64 . La plateforme x86 est incompatible avec le processus 64 bits dans Visual Studio 2022.

Extensions écrites en C++

Le Kit de développement logiciel (SDK) Visual Studio pour les extensions compilées avec C++ est disponible avec le Kit de développement logiciel (SDK) Visual Studio installé, comme d’habitude.

Même si vous ne référencez aucune modification cassante, les extensions doivent être compilées spécifiquement sur le Kit de développement logiciel (SDK) Visual Studio 2022 et pour AMD64.

Extensions avec du code en cours d’exécution

Les extensions avec du code en cours d’exécution doivent être compilées spécifiquement pour Visual Studio 2022. Visual Studio 2022 ne charge aucune extension qui cible une version antérieure de Visual Studio.

Découvrez comment migrer vos extensions pour les versions antérieures de Visual Studio vers Visual Studio 2022 :

  1. Moderniser vos projets.
  2. Refactorisez votre code source dans un projet partagé pour permettre le ciblage de Visual Studio 2022 et des versions antérieures.
  3. Ajoutez un projet VSIX ciblé par Visual Studio 2022 et une table de remapping de package/assembly.
  4. Effectuez les ajustements de code nécessaires.
  5. Testez votre extension Visual Studio 2022.
  6. Publiez votre extension Visual Studio 2022.

Extensions sans exécuter de code

Les extensions qui ne contiennent aucun code en cours d’exécution (par exemple, des modèles de projet ou d’élément) ne sont pas nécessaires pour suivre les étapes précédentes, notamment la production de deux VSIX distincts.

Au lieu de cela, modifiez un VSIX afin que son source.extension.vsixmanifest fichier déclare deux cibles d’installation :

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

Vous pouvez ignorer les étapes décrites dans cet article sur l’utilisation de projets partagés et de plusieurs VSIX. Vous pouvez procéder au test.

Remarque

Si vous créez une nouvelle extension Visual Studio à l’aide de Visual Studio 2022 et que vous souhaitez également cibler Visual Studio 2019 ou une version antérieure, consultez ce guide.

tâches MSBuild

Si vous créez des tâches MSBuild, sachez que dans Visual Studio 2022, il est probable qu’elles seront chargées dans un processus MSBuild.exe 64 bits. Si votre tâche nécessite un processus 32 bits à exécuter, consultez Configurer des cibles et des tâches pour vous assurer que MSBuild charge votre tâche dans un processus 32 bits.

Moderniser votre projet VSIX

Avant d’ajouter la prise en charge de Visual Studio 2022 à votre extension, nous vous recommandons vivement de propre et de moderniser votre projet existant :

  1. Migrer de packages.config vers PackageReference.

  2. Remplacez les références directes d’assembly du Kit de développement logiciel (SDK) Visual Studio par PackageReference des éléments :

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

    Conseil

    Vous pouvez remplacer de nombreuses références d’assembly par unePackageReference seule instance pour le métapackage :

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

    Veillez à choisir les versions de package qui correspondent à la version minimale de Visual Studio que vous ciblez.

Certains assemblys qui ne sont pas uniques au Kit de développement logiciel (SDK) Visual Studio (par exemple Newtonsoft.Json.dll) peuvent avoir été détectables par le biais d’une référence simple <Reference Include="Newtonsoft.Json" /> avant Visual Studio 2022. Toutefois, dans Visual Studio 2022, ils nécessitent une référence de package à la place. La raison est que certains répertoires du runtime et du SDK Visual Studio ont été supprimés du chemin de recherche d’assembly par défaut dans MSBuild.

Lors du passage des références d’assembly directes aux références de package NuGet, vous pouvez récupérer des références d’assembly et des packages d’analyseur supplémentaires, car NuGet installe automatiquement la fermeture transitive des dépendances. Cela est généralement ok, mais cela peut entraîner des avertissements supplémentaires pendant votre build. Parcourez ces avertissements et résolvez autant que possible. Envisagez d’utiliser des régions dans le code #pragma warning disable <id> pour supprimer les avertissements que vous ne pouvez pas résoudre.

Utiliser des projets partagés pour le multi-ciblage

Les projets partagés sont un type de projet qui a été introduit dans Visual Studio 2015. Les projets partagés dans Visual Studio permettent de partager des fichiers de code source entre plusieurs projets et de générer différemment à l’aide de symboles de compilation conditionnels et d’ensembles uniques de références.

Visual Studio 2022 nécessite un ensemble distinct d’assemblys de référence de toutes les versions antérieures de Visual Studio. Nous vous recommandons donc d’utiliser des projets partagés pour cibler facilement votre extension vers Visual Studio 2022, les versions antérieures et les versions ultérieures. Cette technique vous donnera le partage de code mais des références distinctes.

Dans le contexte des extensions Visual Studio, vous pouvez avoir un projet VSIX pour Visual Studio 2022 et versions ultérieures, et un projet VSIX pour Visual Studio 2019 et versions antérieures. Chacun de ces projets contient uniquement une source.extension.vsixmanifest instance et les références de package au SDK 16.x ou au SDK 17.x. Ces projets VSIX ont également une référence de projet partagé à un nouveau projet partagé qui hébergera tout votre code source qui peut être partagé entre les deux versions de Visual Studio.

Cette section suppose que vous disposez déjà d’un projet VSIX qui cible Visual Studio 2019 et que vous souhaitez que votre extension fonctionne sur Visual Studio 2022.

Vous pouvez effectuer toutes ces étapes à l’aide de Visual Studio 2019 :

  1. Si vous ne l’avez pas déjà fait, moderniser vos projets pour faciliter les étapes plus loin dans ce processus de mise à jour.

  2. Ajoutez un nouveau projet partagé à votre solution pour chaque projet existant qui fait référence au Kit de développement logiciel (SDK) Visual Studio. Cliquez avec le bouton droit sur la solution, puis sélectionnez Ajouter>un nouveau projet.

    Screenshot that shows the selections for adding a new project.

  3. Dans la boîte de dialogue Ajouter un nouveau projet , recherchez un projet partagé, puis sélectionnez le modèle Projet partagé.

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

  4. Ajoutez une référence à partir de chaque projet de référencement du Kit de développement logiciel (SDK) Visual Studio à son équivalent de projet partagé.

    Screenshot that shows selections for adding a shared project reference.

  5. Déplacez tout le code source (y compris les fichiers .cs et .resx ) de chaque projet de référencement du Kit de développement logiciel (SDK) Visual Studio vers son équivalent de projet partagé. Laissez le fichier source.extension.vsixmanifest dans le projet VSIX.

    Screenshot that shows a shared project containing all source files.

  6. Déplacez des fichiers de métadonnées (par exemple, des notes de publication, une licence et des icônes) et des fichiers VSCT vers un répertoire partagé. Ajoutez-les ensuite en tant que fichiers liés au projet VSIX. Notez que le répertoire partagé est distinct du projet partagé.

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

    • Pour les fichiers de métadonnées, définissez l’action de génération sur Contenu. Définissez Include dans VSIX sur True.

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

    • Pour les fichiers VSCT, définissez l’action de génération sur VSCTCompile. Définissez Include dans VSIX sur False.

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

      Si Visual Studio se plaint que ce paramètre n’est pas pris en charge, vous pouvez modifier manuellement l’action de génération en déchargeant le projet et en passant Content à 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. Générez votre projet pour confirmer que vous n’avez pas introduit d’erreurs.

Votre projet est maintenant prêt à ajouter la prise en charge de Visual Studio 2022.

Ajouter une cible Visual Studio 2022

Cette section part du principe que vous avez effectué les étapes pour factoriser votre extension Visual Studio avec des projets partagés.

Ajoutez la prise en charge de Visual Studio 2022 à votre extension en procédant comme suit. Vous pouvez les compléter à l’aide de Visual Studio 2019.

  1. Ajoutez un nouveau projet VSIX à votre solution. Ce projet cible Visual Studio 2022. Supprimez tout code source fourni avec le modèle, mais conservez le fichier source.extension.vsixmanifest .

  2. Sur votre nouveau projet VSIX, ajoutez une référence au même projet partagé que vos références VSIX ciblant Visual Studio 2019.

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

  3. Vérifiez que le nouveau projet VSIX est généré correctement. Vous devrez peut-être ajouter des références pour correspondre à votre projet VSIX d’origine pour résoudre les erreurs du compilateur.

  4. Pour les extensions Visual Studio gérées, mettez à jour vos références de package de 16.x (ou version antérieure) vers les versions de package 17.x dans votre fichier projet ciblé par Visual Studio 2022. Utilisez le Gestionnaire de package NuGet ou modifiez directement le fichier projet :

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

    Les versions indiquées dans le code précédent ne sont que pour démonstration. Dans votre code, utilisez des versions disponibles à partir du site web NuGet.

    Dans de nombreux cas, les ID de package ont changé. Pour obtenir la liste des modifications apportées à Visual Studio 2022, reportez-vous à la table de mappage de package/assembly.

    Les extensions écrites en C++ n’ont pas encore de SDK disponible pour la compilation.

  5. Pour les projets C++, les extensions doivent être compilées pour AMD64. Pour les extensions managées, envisagez de modifier votre projet de la génération de n’importe quel processeur en ciblant x64. Cette modification garantit que dans Visual Studio 2022, votre extension se charge toujours dans un processus 64 bits. Tout processeur est également correct, mais il peut produire des avertissements si vous référencez des fichiers binaires natifs x64 uniquement.

    Toute dépendance que votre extension peut avoir sur un module natif doit être mise à jour d’une image x86 vers une image AMD64.

  6. Modifiez votre fichier source.extension.vsixmanifest pour refléter le ciblage de Visual Studio 2022. Définissez la <InstallationTarget> balise pour indiquer Visual Studio 2022. Définissez l’élément ProductArchitecture pour indiquer une charge utile AMD64.

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

    Important

    Dans Visual Studio 2019, le concepteur de ce fichier n’expose pas le nouvel ProductArchitecture élément. Vous devez utiliser un éditeur XML pour apporter cette modification. Pour accéder à l’éditeur XML, accédez à Explorateur de solutions et sélectionnez la commande Ouvrir avec.

    L’élément ProductArchitecture est critique. Visual Studio 2022 n’installe pas votre extension sans celle-ci.

    Élément Valeur Description
    ProductArchitecture x86, amd64 Plateformes prises en charge par ce VSIX. Pas sensible à la casse. Utilisez une plateforme par élément et un élément par InstallationTarget instance. Pour les versions de produit inférieures à 17.0, la valeur par défaut est x86 et peut être omise. Pour les versions de produit 17.0 et ultérieures, cet élément est requis et aucune valeur par défaut n’est présente. Pour Visual Studio 2022, le seul contenu valide pour cet élément est amd64.
  7. Effectuez les autres ajustements nécessaires dans source.extension.vsixmanifest pour correspondre à celui qui cible Visual Studio 2019 (le cas échéant).

    Si vous publiez deux versions de votre extension qui ciblent chacune une version différente de Visual Studio, vérifiez que l’ID du VSIX dans l’élément Identity du manifeste est différent pour chaque extension.

À ce stade, vous disposez d’une extension VSIX ciblée par Visual Studio 2022. Vous devez générer votre projet VSIX ciblé par Visual Studio 2022 et parcourir les sauts de build qui s’affichent. Si vous n’avez pas de sauts de build dans votre projet VSIX ciblé par Visual Studio 2022, félicitations ! Vous êtes prêt à tester.

Gérer les changements d’API cassants

Les modifications d’API cassants peuvent nécessiter des mises à jour du code qui s’exécutaient sur des versions antérieures de Visual Studio. Pour obtenir des conseils sur la mise à jour de votre code, consultez Changements d’API cassants dans Visual Studio 2022.

Lorsque vous adaptez votre code, nous vous recommandons d’utiliser la compilation conditionnelle. Votre code peut ensuite continuer à prendre en charge les versions antérieures de Visual Studio tout en ajoutant la prise en charge de Visual Studio 2022.

Lorsque vous obtenez votre génération d’extensions ciblées sur Visual Studio 2022, passez aux tests.

Utiliser des symboles de compilation conditionnelle

Si vous souhaitez utiliser le même code source, même le même fichier, pour Visual Studio 2022 et les versions antérieures, vous devrez peut-être utiliser la compilation conditionnelle. Vous pouvez ensuite fork votre code pour s’adapter aux changements cassants. La compilation conditionnelle est une fonctionnalité des langages C#, Visual Basic et C++. Il peut être utilisé pour partager la plupart du code tout en tenant compte des API divergentes dans des endroits spécifiques.

Pour plus d’informations sur l’utilisation des directives de préprocesseur et des symboles de compilation conditionnelle, consultez les directives de préprocesseur C#.

Vos projets qui ciblent les versions antérieures de Visual Studio ont besoin d’un symbole de compilation conditionnelle. Ce symbole peut ensuite être utilisé pour dupliquer le code afin d’utiliser les différentes API. Vous pouvez définir le symbole de compilation conditionnelle sur la page des propriétés du projet :

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

Veillez à définir le symbole de compilation pour toutes les configurations. Par défaut, le symbole que vous entrez peut s’appliquer à une seule configuration.

Techniques C#

Vous pouvez utiliser votre symbole de compilation comme directive de préprocesseur (#if), comme indiqué dans le code suivant. Vous pouvez ensuite fork votre code pour gérer une modification cassant entre les versions 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

Dans certains cas, vous pouvez utiliser var pour éviter de nommer le type et éviter la nécessité de #if régions. L’extrait de code précédent peut également être écrit comme suit :

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

Lorsque vous utilisez la syntaxe, notez comment vous pouvez utiliser la liste déroulante pour le contexte du service de langage pour modifier la #if mise en surbrillance de la syntaxe. L’autre liste déroulante aide le service de langage à attirer l’attention sur une version cible de Visual Studio pour cette extension par rapport à une autre.

Screenshot that shows conditional compilation in a shared project.

Techniques de partage XAML

XAML n’a pas de préprocesseur pour autoriser la personnalisation du contenu en fonction des symboles de préprocesseur. Vous devrez peut-être copier et gérer deux pages XAML dont le contenu diffère entre Visual Studio 2022 et les versions antérieures.

Dans certains cas, une référence à un type qui existe dans des assemblys distincts dans Visual Studio 2022 et les versions antérieures peut toujours être représentée dans un fichier XAML. Supprimez l’espace de noms qui fait référence à l’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}"

Tester votre extension

Pour tester une extension qui cible Visual Studio 2022, vous devez installer Visual Studio 2022. Vous ne pourrez pas exécuter d’extensions 64 bits sur des versions antérieures de Visual Studio.

Vous pouvez utiliser Visual Studio 2022 pour générer et tester vos extensions, qu’elles ciblent Visual Studio 2022 ou une version antérieure. Lorsque vous ouvrez un projet VSIX à partir de Visual Studio 2022, une instance expérimentale de Visual Studio s’ouvre.

Nous vous recommandons vivement de tester avec chaque version de Visual Studio que vous souhaitez prendre en charge l’extension.

Publier votre extension

Vous avez ajouté une cible Visual Studio 2022 à votre extension et l’avez testée. Maintenant, vous êtes prêt à publier l’extension pour que le monde admire.

Visual Studio Marketplace

La publication de votre extension sur Visual Studio Marketplace est un excellent moyen d’obtenir de nouveaux utilisateurs pour rechercher et installer votre extension. Que votre extension cible Visual Studio 2022 exclusivement ou cible également des versions antérieures de Visual Studio, la Place de marché est là pour vous prendre en charge.

À l’avenir, la Place de marché vous permettra de charger plusieurs VSIX sur une seule description de la Place de marché. Vous pouvez ensuite charger votre VSIX ciblé par Visual Studio 2022 et un VSIX pour une version antérieure de Visual Studio. Vos utilisateurs obtiennent automatiquement le vsIX approprié pour la version de Visual Studio qu’ils ont installée, lorsqu’ils utilisent le gestionnaire d’extensions Visual Studio.

Programme d’installation personnalisé

Si vous générez un fichier MSI ou EXE pour installer votre extension et générer vsixinstaller.exe pour installer (partie de) votre extension, sachez que le programme d’installation VSIX dans Visual Studio 2022 a été mis à jour. Les développeurs doivent utiliser la version du programme d’installation VSIX fourni avec Visual Studio 2022 pour installer des extensions dans cette version de Visual Studio.

Le programme d’installation VSIX dans Visual Studio 2022 installe également les extensions applicables qui ciblent les versions précédentes de Visual Studio qui existent avec Visual Studio 2022 sur le même ordinateur.

Partage réseau

Vous pouvez partager votre extension via un réseau local ou d’une autre façon. Si vous ciblez Visual Studio 2022 et versions antérieures, vous devez partager individuellement vos plusieurs VSIX. Donnez-leur des noms de fichiers (ou placez-les dans des dossiers uniques) qui aident vos utilisateurs à savoir quel VSIX installer en fonction de la version de Visual Studio qu’ils ont installée.

Dépendances

Si votre VSIX spécifie d’autres VSIX en tant que dépendances via l’élément <dependency> , chaque VSIX référencé doit être installé dans les mêmes cibles et architectures de produit que votre VSIX. Si un VSIX dépendant ne prend pas en charge l’installation ciblée de Visual Studio, votre VSIX échoue.

Il est ok pour le VSIX dépendant de prendre en charge plus de cibles et d’architectures que le vôtre, mais pas moins. Cette restriction signifie que l’approche de déploiement et de distribution d’un VSIX avec dépendances doit miroir celle de ses dépendants.

Questions et réponses

Q : Mon extension ne nécessite aucune modification d’interopérabilité, car elle fournit simplement des données (par exemple, des modèles). Puis-je créer une seule extension qui inclut également Visual Studio 2022 ?

R : Oui. Consultez extensions sans exécuter de code pour plus d’informations sur ce problème.

Q : Une dépendance NuGet apporte des assemblys d’interopérabilité anciens et provoque des conflits de classes. Que dois-je faire ?

R : Ajoutez la ligne suivante à votre fichier .csproj pour éviter les assemblys en double :

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

Ce code empêche les références de package d’importer l’ancienne version de l’assembly à partir d’autres dépendances.

Q : Mes commandes et touches d’accès rapide ont cessé de fonctionner dans Visual Studio après avoir basculé mes fichiers sources vers un projet partagé. Que dois-je faire ?

R : l’étape 2.4 de l’exemple d’optimiseur d’image montre comment ajouter des fichiers VSCT en tant qu’éléments liés afin qu’ils soient compilés dans votre fichier VSCT.

Suivez un exemple pas à pas, ImageOptimizer, avec des liens vers le projet et des modifications de code pour chaque étape.