Partage via


Mettre à jour une extension Visual Studio pour Visual Studio 2022

Important

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

De nombreuses extensions fonctionneront à la fois dans Visual Studio 2019 et Visual Studio 2022 avec des changements mineurs qui ne nécessiteront pas de suivre les conseils sur la modernisation de votre extension dans cet article. Essayez votre extension dans Visual Studio 2022 et évaluez quelle option est la meilleure pour votre extension.

Visual Studio 2022 est une application 64 bits et introduit des changements radicaux dans le SDK de Visual Studio. Cet article vous guide à travers les étapes nécessaires pour faire fonctionner votre extension avec l'aperçu actuel de Visual Studio 2022. Votre extension sera alors prête à être installée par les utilisateurs avant la disponibilité générale de Visual Studio 2022.

Installer Visual Studio et compiler les extensions

Installez Visual Studio 2022 à partir des téléchargements de 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 :

  • Le métapackage Microsoft.VisualStudio.Sdk (versions 17.x) contient la plupart ou la totalité des assemblys de référence dont vous aurez besoin.
  • Le package Microsoft.VSSDK.BuildTools (versions 17.x) doit être référencé dans votre projet VSIX afin qu’il puisse générer un VSIX compatible avec Visual Studio 2022.

Même si vous ne référencez aucun changement de rupture, les extensions doivent être compilées avec tout processeur ou la plateforme x64. La plateforme x86 est incompatible avec le processus 64 bits de Visual Studio 2022.

Extensions écrites en C++

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

Même si vous ne faites référence à aucune rupture, les extensions doivent être compilées spécifiquement avec le SDK de Visual Studio 2022 et pour AMD64.

Extensions avec code d'exécution

Les extensions contenant du code en cours d'exécution doivent être compilées spécifiquement pour Visual Studio 2022. Visual Studio 2022 ne chargera aucune extension ciblant 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. Modernisez vos projets.
  2. Reformulez votre code source en un projet partagé afin de pouvoir cibler Visual Studio 2022 et les versions antérieures.
  3. Ajoutez un projet VSIX ciblant Visual Studio 2022 et une table de remappage des packages/assemblages.
  4. Effectuez les ajustements de code nécessaires.
  5. Testez votre extension Visual Studio 2022.
  6. Publiez votre extension Visual Studio 2022.

Extensions sans code en cours d'exécution

Les extensions qui ne contiennent pas de code en cours d'exécution (par exemple, les modèles de projet ou d'élément) ne sont pas tenues de suivre les étapes précédentes, y compris la production de deux VSIX distincts.

Au lieu de cela, modifiez l'unique VSIX pour que son fichier source.extension.vsixmanifest 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 de cet article concernant l'utilisation de projets partagés et de plusieurs VSIX. Vous pouvez procéder aux tests.

Remarque

Si vous créez une nouvelle extension Visual Studio en utilisant 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 soient chargées dans un processus MSBuild.exe 64 bits. Si votre tâche nécessite un processus 32 bits pour s'exécuter, voir Configurer les cibles et les tâches pour s'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 nettoyer et de moderniser votre projet existant :

  1. Migrer de packages.config vers PackageReference.

  2. Remplacez toutes les références directes à l'assembly Visual Studio SDK par des éléments PackageReference :

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

    Conseil

    Vous pouvez remplacer de nombreuses références assembly par une seule instance PackageReference 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 des versions de package qui correspondent à la version minimale de Visual Studio que vous visez.

Certains assemblies qui ne sont pas propres au SDK de Visual Studio (par exemple, Newtonsoft.Json.dll) auraient pu être découverts par une simple référence <Reference Include="Newtonsoft.Json" /> avant Visual Studio 2022. Mais dans Visual Studio 2022, ils exigent plutôt une référence de package. La raison en est que certains répertoires de runtime et de SDK de Visual Studio ont été supprimés du chemin de recherche d'assemblages par défaut dans MSBuild.

En passant des références d'assemblages directes aux références de packages NuGet, vous risquez de récupérer des références d'assemblages et des packages d'analyse supplémentaires, car NuGet installe automatiquement la fermeture transitive des dépendances. C'est généralement correct, mais cela peut entraîner des avertissements supplémentaires pendant votre construction. Examinez ces avertissements et résolvez-en le plus grand nombre possible. Pensez à utiliser des régions #pragma warning disable <id> dans le code pour supprimer les avertissements que vous ne pouvez pas résoudre.

Utilisez des projets partagés pour le multiciblage

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 les compiler différemment en utilisant des symboles de compilation conditionnelle et des ensembles de références uniques.

Visual Studio 2022 nécessite un ensemble d'assemblages de référence distinct de toutes les versions antérieures de Visual Studio. Nous vous recommandons donc d'utiliser des projets partagés pour cibler plusieurs fois votre extension sur Visual Studio 2022, les versions antérieures et les versions ultérieures. Cette technique vous permettra de partager du code tout en ayant des références distinctes.

Dans le contexte des extensions Visual Studio, vous pourriez avoir un projet VSIX pour Visual Studio 2022 et les versions ultérieures, et un projet VSIX pour Visual Studio 2019 et les versions antérieures. Chacun de ces projets ne contiendrait qu'une instance source.extension.vsixmanifest et les références du package vers le SDK 16.x ou le SDK 17.x. Ces projets VSIX auraient également une référence de projet partagé vers un nouveau projet partagé qui hébergera tout votre code source pouvant être partagé entre les deux versions de Visual Studio.

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

Vous pouvez réaliser toutes ces étapes en utilisant Visual Studio 2019 :

  1. Si vous ne l'avez pas encore fait, modernisez vos projets pour faciliter les étapes ultérieures de ce processus de mise à jour.

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

    Capture d'écran montrant les sélections pour l'ajout d'un nouveau projet.

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

    Capture d'écran illustrant la recherche et la sélection du modèle de projet partagé.

  4. Ajoutez une référence de chaque projet référençant Visual Studio SDK à son homologue de projet partagé.

    Capture d'écran illustrant les sélections pour l'ajout d'une référence de projet partagé.

  5. Déplacez tout le code source (y compris les fichiers .cs et .resx) de chaque projet de référence au SDK de Visual Studio vers son homologue de projet partagé. Laissez le fichier source.extension.vsixmanifest dans le projet VSIX.

    Capture d'écran montrant un projet partagé contenant tous les fichiers source.

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

    Capture d'écran montrant les sélections pour l'ajout de métadonnées et de fichiers V S C T en tant que fichiers liés.

    • Pour les fichiers de métadonnées, définissez Build Action sur Content. Définissez Inclure dans VSIX sur Vrai.

      Capture d'écran montrant l'inclusion des fichiers de métadonnées dans V S I X.

    • Pour les fichiers VSCT, définissez l'action de construction sur VSCTCompile. Définissez Inclure dans VSIX sur Faux.

      Capture d'écran montrant les propriétés sélectionnées pour un fichier V S C T.

      Si Visual Studio signale que ce paramètre n'est pas pris en charge, vous pouvez modifier manuellement l'action de construction en déchargeant le projet et en remplaçant Content par 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. Compilez 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 suppose que vous avez terminé les étapes visant à factoriser votre extension Visual Studio avec des projets partagés.

Ajoutez la prise en charge de Visual Studio 2022 à votre extension en suivant les étapes suivantes. Vous pouvez les réaliser en utilisant Visual Studio 2019.

  1. Ajoutez un nouveau projet VSIX à votre solution. Ce projet ciblera 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 celui auquel votre VSIX ciblant Visual Studio 2019 fait référence.

    La capture d'écran qui montre une solution avec un projet partagé et deux projets V S I X.

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

  4. Pour les extensions Visual Studio gérées, mettez à jour vos références de package de 16.x (ou antérieures) vers les versions de package 17.x dans votre fichier de projet ciblant Visual Studio 2022. Utilisez le gestionnaire de packages NuGet ou modifiez directement le fichier de 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 présentées dans le code précédent ne sont là qu'à titre de démonstration. Dans votre code, utilisez les versions disponibles sur le site Web de NuGet.

    Dans de nombreux cas, les ID des packages ont changé. Pour obtenir la liste des changements dans Visual Studio 2022, reportez-vous au tableau de correspondance package/assemblage.

    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 gérées, envisagez de modifier votre projet en passant de la compilation pour tout processeur au ciblage de x64. Ce changement garantit que dans Visual Studio 2022, votre extension se charge toujours dans un processus 64 bits. Tout processeur convient également, mais cela pourrait produire des avertissements si vous faites référence à des binaires natifs uniquement x64.

    Toute dépendance que votre extension pourrait avoir sur un module natif devra être mise à jour d'une image x86 à une image AMD64.

  6. Modifiez votre fichier source.extension.vsixmanifest pour refléter le ciblage de Visual Studio 2022. Définissez la balise <InstallationTarget> 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 élément ProductArchitecture. Vous devez utiliser un éditeur XML pour effectuer ce changement. Pour accéder à l'éditeur XML, accédez à l'Explorateur de solutions et sélectionnez la commande Ouvrir avec.

    L’élément ProductArchitecture est critique. Visual Studio 2022 n'installera pas votre extension sans cet éditeur.

    Élément Valeur Description
    ProductArchitecture x86, amd64 Les plateformes prises en charge par ce VSIX. Non sensible à la casse. Utilisez une plate-forme par élément et un élément par instance InstallationTarget. Pour les versions de produits inférieures à 17.0, la valeur par défaut est x86 et peut être omise. Pour les versions 17.0 et ultérieures du produit, cet élément est obligatoire et il n'y a pas de valeur par défaut. Pour Visual Studio 2022, le seul contenu valide pour cet élément est amd64.
  7. Effectuez tout autre ajustement nécessaire 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, assurez-vous 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 devriez construire votre projet VSIX ciblant Visual Studio 2022 et travailler sur les ruptures de construction qui apparaissent. Si votre projet VSIX ciblé par Visual Studio 2022 ne présente pas d'interruptions de compilation, félicitations ! Vous êtes prêt pour les tests.

Gérer les ruptures d'API

Les ruptures dans les API peuvent nécessiter des mises à jour du code exécuté sur des versions antérieures de Visual Studio. Pour obtenir des conseils sur la mise à jour de votre code, consultez la section Rupture des modifications de l'API dans Visual Studio 2022.

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

Lorsque votre extension ciblant Visual Studio 2022 est construite, passez aux tests.

Utiliser des symboles de compilation conditionnelle

Si vous souhaitez utiliser le même code source, voire le même fichier, pour Visual Studio 2022 et les versions antérieures, vous devrez peut-être recourir à la compilation conditionnelle. Vous pourrez alors forker votre code pour l'adapter aux changements de rupture. La compilation conditionnelle est une fonctionnalité des langages C#, Visual Basic et C++. Elle peut être utilisée pour partager la majeure partie du code tout en tenant compte des API divergentes à certains endroits.

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

Vos projets ciblant des versions antérieures de Visual Studio auront besoin d'un symbole de compilation conditionnelle. Ce symbole peut ensuite être utilisé pour bifurquer 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 :

Capture d'écran montrant la boîte de saisie d'un symbole de compilation conditionnelle.

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

Techniques C#

Vous pouvez utiliser votre symbole de compilation comme une directive de préprocesseur (#if), comme le montre le code suivant. Vous pouvez alors forker votre code pour faire face à un changement de rupture 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 de devoir utiliser des régions #if. L'extrait 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 #if, remarquez que vous pouvez utiliser la liste déroulante du contexte du service linguistique pour modifier la coloration syntaxique. La liste déroulante other aide le service linguistique à concentrer son attention sur une version cible de Visual Studio pour cette extension plutôt qu'une autre.

Capture d'écran montrant la compilation conditionnelle dans un projet partagé.

Techniques de partage XAML

XAML n'a pas de préprocesseur permettant de personnaliser le contenu en fonction des symboles du préprocesseur. Il se peut que vous deviez copier et maintenir 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 assemblages distincts entre Visual Studio 2022 et les versions antérieures peut encore être représentée dans un seul fichier XAML. Supprimez l'espace de noms qui fait référence à l'assemblage :

-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 avoir installé 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 créer et tester vos extensions, qu'elles soient destinées à 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 d'effectuer des tests avec chaque version de Visual Studio que vous souhaitez que l'extension prenne en charge.

Publier votre extension

Vous avez ajouté une cible Visual Studio 2022 à votre extension et l'avez testée. Vous êtes maintenant prêt à publier l'extension pour qu'elle soit admirée par le monde entier.

Visual Studio Marketplace

La publication de votre extension sur Visual Studio Marketplace est un excellent moyen de permettre à de nouveaux utilisateurs de la trouver et de l'installer. Que votre extension cible exclusivement Visual Studio 2022 ou qu'elle vise également des versions plus anciennes de Visual Studio, le Marketplace est là pour vous aider.

À l'avenir, le Marketplace vous permettra de charger plusieurs VSIX dans une seule liste Marketplace. Vous pourrez ainsi charger votre VSIX ciblant Visual Studio 2022 et un VSIX pour une version antérieure de Visual Studio. Vos utilisateurs obtiendront automatiquement le bon VSIX pour la version de Visual Studio qu'ils ont installée, lorsqu'ils utiliseront le gestionnaire d'extensions de Visual Studio.

Programme d'installation personnalisé

Si vous créez un fichier MSI ou EXE pour installer votre extension et que vous lancez vsixinstaller.exe pour installer (une partie de) votre extension, sachez que le programme d'installation VSIX de Visual Studio 2022 a été mis à jour. Les développeurs doivent utiliser la version du programme d'installation de VSIX fournie avec Visual Studio 2022 pour installer les extensions de cette version de Visual Studio.

Le programme d'installation VSIX de Visual Studio 2022 installe également les extensions applicables aux versions antérieures de Visual Studio qui existent avec Visual Studio 2022 sur la même machine.

Partage réseau

Vous pouvez partager votre extension sur un réseau local ou de toute autre manière. Si vous ciblez Visual Studio 2022 et les versions antérieures, vous devez partager vos multiples VSIX individuellement. Donnez-leur des noms de fichiers (ou placez-les dans des dossiers uniques) qui aideront vos utilisateurs à savoir quel VSIX installer en fonction de la version de Visual Studio qu'ils ont installée.

Les dépendances

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

Le VSIX dépendant peut 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 des dépendances doit refléter celle de ses dépendances.

Questions & réponses

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

R : Oui. Consultez la section Extensions sans code d'exécution pour plus d'informations à ce sujet.

Q : Une dépendance NuGet apporte d'anciens assemblages d'interopérabilité et provoque des clashs de classes. Que dois-je faire ?

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

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

Ce code empêchera les références de package d'importer l'ancienne version de l'assemblage à partir d'autres dépendances.

Q : Mes commandes et mes raccourcis clavier ont cessé de fonctionner dans Visual Studio après que j'ai transféré mes fichiers sources vers un projet partagé. Que dois-je faire ?

R : L'étape 2.4 de l'exemple Image Optimizer 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 étape par étape, ImageOptimizer, avec des liens vers le projet et les modifications de code pour chaque étape.