Aggiornare un'estensione di Visual Studio per Visual Studio 2022

Importante

Il consiglio di questo articolo può guidare gli sviluppatori nella migrazione delle estensioni che richiedono modifiche importanti per funzionare sia in Visual Studio 2019 che in Visual Studio 2022. In questi casi, è consigliabile avere due progetti VSIX e la compilazione condizionale.

Molte estensioni funzioneranno sia in Visual Studio 2019 che in Visual Studio 2022 con modifiche secondarie che non richiederanno la modernizzazione dell'estensione in questo articolo. Provare l'estensione in Visual Studio 2022 e valutare qual è l'opzione migliore per l'estensione.

Visual Studio 2022 è un'applicazione a 64 bit e introduce alcune modifiche di rilievo in Visual Studio SDK. Questo articolo illustra i passaggi necessari per usare l'estensione con l'anteprima corrente di Visual Studio 2022. L'estensione può quindi essere pronta per l'installazione degli utenti prima che Visual Studio 2022 raggiunga la disponibilità generale.

Installare Visual Studio e compilare le estensioni

Installare Visual Studio 2022 dai download di Visual Studio 2022.

Estensioni scritte in un linguaggio .NET

Visual Studio SDK destinato a Visual Studio 2022 per le estensioni gestite è esclusivamente in NuGet:

Anche se non si fa riferimento ad alcuna modifica di rilievo, le estensioni devono essere compilate con la piattaforma Any CPU o x64 . La piattaforma x86 non è compatibile con il processo a 64 bit in Visual Studio 2022.

Estensioni scritte in C++

Visual Studio SDK per le estensioni compilate con C++ è disponibile con Visual Studio SDK installato, come di consueto.

Anche se non si fa riferimento ad alcuna modifica di rilievo, le estensioni devono essere compilate in modo specifico in Visual Studio 2022 SDK e per AMD64.

Estensioni con codice in esecuzione

Le estensioni con codice in esecuzione devono essere compilate in modo specifico per Visual Studio 2022. Visual Studio 2022 non caricherà alcuna estensione destinata a una versione precedente di Visual Studio.

Informazioni su come eseguire la migrazione delle estensioni per le versioni precedenti di Visual Studio a Visual Studio 2022:

  1. Modernizzare i progetti.
  2. Effettuare il refactoring del codice sorgente in un progetto condiviso per consentire la destinazione di Visual Studio 2022 e versioni precedenti.
  3. Aggiungere un progetto VSIX di destinazione di Visual Studio 2022 e una tabella di mapping di pacchetto/assembly.
  4. Apportare le modifiche del codice necessarie.
  5. Testare l'estensione di Visual Studio 2022.
  6. Pubblicare l'estensione di Visual Studio 2022.

Estensioni senza eseguire codice

Le estensioni che non contengono codice in esecuzione (ad esempio, modelli di progetto o di elementi) non devono seguire i passaggi precedenti, inclusa la produzione di due VSIX distinti.

Modificare invece l'unico VSIX in modo che il relativo source.extension.vsixmanifest file dichiari due destinazioni di installazione:

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

È possibile ignorare i passaggi descritti in questo articolo sull'uso di progetti condivisi e più VSIX. È possibile procedere con i test.

Nota

Se si sta creando una nuova estensione di Visual Studio usando Visual Studio 2022 e si vuole usare anche Visual Studio 2019 o una versione precedente, vedere questa guida.

MSBuild (attività)

Se si creano attività MSBuild, tenere presente che in Visual Studio 2022 è probabile che vengano caricate in un processo MSBuild.exe a 64 bit. Se l'attività richiede l'esecuzione di un processo a 32 bit, vedere Configurare destinazioni e attività per assicurarsi che MSBuild carichi l'attività in un processo a 32 bit.

Modernizzare il progetto VSIX

Prima di aggiungere il supporto di Visual Studio 2022 all'estensione, è consigliabile pulire e modernizzare il progetto esistente:

  1. Eseguire la migrazione da packages.config a PackageReference.

  2. Sostituire tutti i riferimenti diretti agli assembly di Visual Studio SDK con PackageReference gli elementi:

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

    Suggerimento

    È possibile sostituire molti riferimenti ad assembly con unaPackageReference sola istanza per il metapacchetto:

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

    Assicurarsi di selezionare le versioni del pacchetto che corrispondono alla versione minima di Visual Studio di destinazione.

Alcuni assembly non univoci per Visual Studio SDK (ad esempio Newtonsoft.Json.dll) potrebbero essere stati individuabili tramite un semplice <Reference Include="Newtonsoft.Json" /> riferimento prima di Visual Studio 2022. Ma in Visual Studio 2022, richiedono invece un riferimento al pacchetto. Il motivo è che alcune directory di Visual Studio e SDK sono state rimosse dal percorso di ricerca di assembly predefinito in MSBuild.

Quando si passa da riferimenti di assembly diretti ai riferimenti al pacchetto NuGet, è possibile selezionare riferimenti ad assembly aggiuntivi e pacchetti analizzatori perché NuGet installa automaticamente la chiusura transitiva delle dipendenze. Questa operazione è in genere ok, ma potrebbe comportare avvisi aggiuntivi durante la compilazione. Esaminare questi avvisi e risolvere il numero possibile di avvisi. Prendere in considerazione l'uso di aree nel codice #pragma warning disable <id> per eliminare gli avvisi che non è possibile risolvere.

Usare progetti condivisi per il multitargeting

I progetti condivisi sono un tipo di progetto introdotto in Visual Studio 2015. I progetti condivisi in Visual Studio consentono la condivisione di file di codice sorgente tra più progetti e la compilazione in modo diverso usando simboli di compilazione condizionale e set univoci di riferimenti.

Visual Studio 2022 richiede un set distinto di assembly di riferimento di tutte le versioni precedenti di Visual Studio. È quindi consigliabile usare progetti condivisi per più destinazioni dell'estensione in Visual Studio 2022, versioni precedenti e versioni successive. Questa tecnica ti darà la condivisione del codice ma riferimenti distinti.

Nel contesto delle estensioni di Visual Studio, è possibile avere un progetto VSIX per Visual Studio 2022 e versioni successive e un progetto VSIX per Visual Studio 2019 e versioni precedenti. Ognuno di questi progetti conterrà solo un'istanza source.extension.vsixmanifest e i riferimenti al pacchetto a 16.x SDK o 17.x SDK. Questi progetti VSIX avrebbero anche un riferimento al progetto condiviso a un nuovo progetto condiviso che ospiterà tutto il codice sorgente che può essere condiviso tra le due versioni di Visual Studio.

Questa sezione presuppone che sia già disponibile un progetto VSIX destinato a Visual Studio 2019 e che si vuole che l'estensione funzioni in Visual Studio 2022.

È possibile completare tutti questi passaggi usando Visual Studio 2019:

  1. Se non è già stato fatto, modernizzare i progetti per semplificare i passaggi più avanti in questo processo di aggiornamento.

  2. Aggiungere un nuovo progetto condiviso alla soluzione per ogni progetto esistente che fa riferimento a Visual Studio SDK. Fare clic con il pulsante destro del mouse sulla soluzione e quindi scegliere Aggiungi>nuovo progetto.

    Screenshot that shows the selections for adding a new project.

  3. Nella finestra di dialogo Aggiungi un nuovo progetto cercare un progetto condiviso e quindi selezionare il modello Progetto condiviso.

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

  4. Aggiungere un riferimento da ogni progetto di riferimento di Visual Studio SDK alla controparte del progetto condiviso.

    Screenshot that shows selections for adding a shared project reference.

  5. Spostare tutto il codice sorgente (inclusi i file con estensione cs e resx ) da ogni progetto di visual Studio SDK che fa riferimento alla controparte del progetto condiviso. Lasciare il file source.extension.vsixmanifest nel progetto VSIX.

    Screenshot that shows a shared project containing all source files.

  6. Spostare i file di metadati (ad esempio, note sulla versione, licenza e icone) e i file VSCT in una directory condivisa. Aggiungerli quindi come file collegati al progetto VSIX. Si noti che la directory condivisa è separata dal progetto condiviso.

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

    • Per i file di metadati, impostare Azione di compilazione su Contenuto. Impostare Includi in VSIX su True.

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

    • Per i file VSCT, impostare Azione di compilazione su VSCTCompile. Impostare Includi in VSIX su False.

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

      Se Visual Studio segnala che questa impostazione non è supportata, è possibile modificare manualmente l'azione di compilazione scaricando il progetto e passando 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. Compilare il progetto per verificare che non siano stati introdotti errori.

Il progetto è ora pronto per aggiungere il supporto di Visual Studio 2022.

Aggiungere una destinazione di Visual Studio 2022

Questa sezione presuppone che siano stati completati i passaggi per tenere conto dell'estensione di Visual Studio con progetti condivisi.

Aggiungere il supporto di Visual Studio 2022 all'estensione seguendo questa procedura. È possibile completarli usando Visual Studio 2019.

  1. Aggiungere un nuovo progetto VSIX alla soluzione. Questo progetto sarà destinato a Visual Studio 2022. Rimuovere qualsiasi codice sorgente fornito con il modello, ma mantenere il file source.extension.vsixmanifest .

  2. Nel nuovo progetto VSIX aggiungere un riferimento allo stesso progetto condiviso a cui fanno riferimento i riferimenti VSIX destinati a Visual Studio 2019.

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

  3. Verificare che il nuovo progetto VSIX venga compilato correttamente. Potrebbe essere necessario aggiungere riferimenti in modo che corrispondano al progetto VSIX originale per risolvere eventuali errori del compilatore.

  4. Per le estensioni di Visual Studio gestite, aggiornare i riferimenti al pacchetto dalla versione 16.x (o precedente) alle versioni del pacchetto 17.x nel file di progetto di destinazione di Visual Studio 2022. Usare il Gestione pacchetti NuGet o modificare direttamente il file di progetto:

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

    Le versioni mostrate nel codice precedente sono solo per la dimostrazione. Nel codice usare le versioni disponibili nel sito Web NuGet.

    In molti casi, gli ID pacchetto sono stati modificati. Per un elenco delle modifiche in Visual Studio 2022, vedere la tabella di mapping di pacchetti/assembly.

    Le estensioni scritte in C++ non hanno ancora un SDK disponibile per la compilazione.

  5. Per i progetti C++, le estensioni devono essere compilate per AMD64. Per le estensioni gestite, è consigliabile modificare il progetto dalla compilazione a Qualsiasi CPU alla destinazione x64. Questa modifica garantisce che in Visual Studio 2022 l'estensione viene sempre caricata in un processo a 64 bit. Anche qualsiasi CPU funziona correttamente, ma potrebbe generare avvisi se si fa riferimento a file binari nativi x64.

    Qualsiasi dipendenza che l'estensione potrebbe avere in un modulo nativo dovrà essere aggiornata da un'immagine x86 a un'immagine AMD64.

  6. Modificare il file source.extension.vsixmanifest per riflettere la destinazione di Visual Studio 2022. Impostare il <InstallationTarget> tag per indicare Visual Studio 2022. Impostare l'elemento ProductArchitecture per indicare un payload AMD64.

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

    Importante

    In Visual Studio 2019 la finestra di progettazione per questo file non espone il nuovo ProductArchitecture elemento. Per apportare questa modifica, è necessario usare un editor XML. Per accedere all'editor XML, passare a Esplora soluzioni e selezionare il comando Apri con.

    L'elemento ProductArchitecture è critico. Visual Studio 2022 non installerà l'estensione senza di essa.

    Elemento Valore Descrizione
    ProductArchitecture x86, amd64 Piattaforme supportate da questo VSIX. Senza distinzione tra maiuscole e minuscole. Usare una piattaforma per elemento e un elemento per ogni InstallationTarget istanza. Per le versioni del prodotto inferiori a 17.0, il valore predefinito è x86 e può essere omesso. Per le versioni del prodotto 17.0 e successive, questo elemento è obbligatorio e non esiste alcun valore predefinito. Per Visual Studio 2022, l'unico contenuto valido per questo elemento è amd64.
  7. Apportare qualsiasi altra modifica necessaria in source.extension.vsixmanifest in modo che corrisponda a quella destinata a Visual Studio 2019 (se presente).

    Se si pubblicano due versioni dell'estensione destinate a una versione diversa di Visual Studio, assicurarsi che l'ID del VSIX nell'elemento Identity del manifesto sia diverso per ogni estensione.

A questo punto, si dispone di un'estensione di destinazione di Visual Studio 2022 VSIX. È consigliabile compilare il progetto VSIX di destinazione di Visual Studio 2022 ed eseguire tutte le interruzioni di compilazione visualizzate. Se nel progetto VSIX di destinazione di Visual Studio 2022 non sono presenti interruzioni di compilazione, congratulazioni. Si è pronti per i test.

Gestire le modifiche che causano un'interruzione dell'API

Le modifiche che causano un'interruzione dell'API potrebbero richiedere aggiornamenti al codice eseguito nelle versioni precedenti di Visual Studio. Per suggerimenti su come aggiornare il codice, vedere Modifiche dell'API di rilievo in Visual Studio 2022.

Quando si adatta il codice, è consigliabile usare la compilazione condizionale. Il codice può quindi continuare a supportare le versioni precedenti di Visual Studio durante l'aggiunta del supporto per Visual Studio 2022.

Quando si ottiene la compilazione dell'estensione di destinazione di Visual Studio 2022, procedere al test.

Usare i simboli di compilazione condizionale

Se si vuole usare lo stesso codice sorgente, anche lo stesso file, per Visual Studio 2022 e versioni precedenti, potrebbe essere necessario usare la compilazione condizionale. È quindi possibile creare una copia tramite fork del codice per adattarsi alle modifiche di rilievo. La compilazione condizionale è una funzionalità dei linguaggi C#, Visual Basic e C++. Può essere usato per condividere la maggior parte del codice, pur ospitando API divergenti in posizioni specifiche.

Per altre informazioni sull'uso delle direttive del preprocessore e dei simboli di compilazione condizionale, vedere Direttive del preprocessore C#.

I progetti destinati alle versioni precedenti di Visual Studio avranno bisogno di un simbolo di compilazione condizionale. Questo simbolo può quindi essere usato per creare una copia tramite fork del codice per usare le diverse API. È possibile impostare il simbolo di compilazione condizionale nella pagina delle proprietà del progetto:

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

Assicurarsi di impostare il simbolo di compilazione per Tutte le configurazioni. Per impostazione predefinita, il simbolo immesso può essere applicato a una sola configurazione.

Tecniche C#

È possibile usare il simbolo di compilazione come direttiva del preprocessore (#if), come illustrato nel codice seguente. È quindi possibile creare una copia tramite fork del codice per gestire una modifica che causa un'interruzione tra le versioni di 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

In alcuni casi, è possibile usare var per evitare di denominare il tipo ed evitare la necessità di aree #if . Il frammento di codice precedente può anche essere scritto come segue:

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

Quando si usa la #if sintassi, si noti come usare l'elenco a discesa per il contesto del servizio di linguaggio per modificare l'evidenziazione della sintassi. L'altro elenco a discesa consente al servizio linguistico di concentrare l'attenzione su una versione di Visual Studio di destinazione per questa estensione rispetto a un'altra.

Screenshot that shows conditional compilation in a shared project.

Tecniche di condivisione XAML

XAML non dispone di un preprocessore per consentire la personalizzazione del contenuto in base ai simboli del preprocessore. Potrebbe essere necessario copiare e gestire due pagine XAML il cui contenuto differisce tra Visual Studio 2022 e versioni precedenti.

In alcuni casi, un riferimento a un tipo presente in assembly distinti in Visual Studio 2022 e versioni precedenti potrebbe essere ancora rappresentabile in un file XAML. Rimuovere lo spazio dei nomi che fa riferimento all'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}"

Testare l'estensione

Per testare un'estensione destinata a Visual Studio 2022, è necessario che Visual Studio 2022 sia installato. Non sarà possibile eseguire estensioni a 64 bit nelle versioni precedenti di Visual Studio.

È possibile usare Visual Studio 2022 per compilare e testare le estensioni se sono destinate a Visual Studio 2022 o a una versione precedente. Quando si apre un progetto VSIX da Visual Studio 2022, viene aperta un'istanza sperimentale di Visual Studio.

È consigliabile testare con ogni versione di Visual Studio che si vuole supportare l'estensione.

Pubblicare l'estensione

È stata aggiunta una destinazione di Visual Studio 2022 all'estensione ed è stata testata. A questo momento si è pronti per pubblicare l'estensione per il mondo da ammirare.

Visual Studio Marketplace

La pubblicazione dell'estensione in Visual Studio Marketplace è un ottimo modo per consentire ai nuovi utenti di trovare e installare l'estensione. Indipendentemente dal fatto che l'estensione sia destinata esclusivamente a Visual Studio 2022 o che sia destinata anche alle versioni precedenti di Visual Studio, il Marketplace è disponibile per supportare l'utente.

In futuro, Marketplace consentirà di caricare più VSIX in una sola presentazione del Marketplace. È quindi possibile caricare visual Studio 2022 con destinazione VSIX e VSIX per una versione precedente di Visual Studio. Gli utenti otterranno automaticamente il VSIX corretto per la versione di Visual Studio installata, quando usano gestione estensioni di Visual Studio.

Programma di installazione personalizzato

Se si compila un file MSI o EXE per installare l'estensione e generarla vsixinstaller.exe per installare (parte dell'estensione), tenere presente che il programma di installazione VSIX in Visual Studio 2022 è stato aggiornato. Gli sviluppatori devono usare la versione del programma di installazione VSIX fornito con Visual Studio 2022 per installare le estensioni in tale versione di Visual Studio.

Il programma di installazione VSIX in Visual Studio 2022 installa anche le estensioni applicabili destinate alle versioni precedenti di Visual Studio esistenti con Visual Studio 2022 nello stesso computer.

Condivisione di rete

È possibile condividere l'estensione su una LAN o in qualsiasi altro modo. Se si usa Visual Studio 2022 e versioni precedenti, è necessario condividere singolarmente più VSIX. Assegnare loro nomi di file (o inserirli in cartelle univoche) che consentono agli utenti di sapere quale VSIX installare in base alla versione di Visual Studio installata.

Dipendenze

Se VSIX specifica altri VSIX come dipendenze tramite l'elemento <dependency> , ogni VSIX a cui si fa riferimento deve essere installato nelle stesse destinazioni e architetture di prodotto del VSIX. Se un VSIX dipendente non supporta l'installazione di destinazione di Visual Studio, il VSIX avrà esito negativo.

È possibile che il VSIX dipendente supporti più destinazioni e architetture rispetto a quelle dell'utente, non solo meno. Questa restrizione significa che l'approccio di distribuzione e distribuzione di un VSIX con dipendenze deve rispecchiare quello dei dipendenti.

Domande e risposte

D: L'estensione non richiede modifiche di interoperabilità perché fornisce solo i dati (ad esempio, i modelli). È possibile creare una singola estensione che includa anche Visual Studio 2022?

R: Sì. Per informazioni su questo argomento, vedi Estensioni senza eseguire codice .

D: Una dipendenza NuGet sta generando assembly di interoperabilità precedenti e causando classi in conflitto. Cosa devo fare?

R: Aggiungere la riga seguente al file con estensione csproj per evitare assembly duplicati:

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

Questo codice impedirà ai riferimenti al pacchetto di importare la versione precedente dell'assembly da altre dipendenze.

D: I comandi e i tasti di scelta rapida hanno smesso di funzionare in Visual Studio dopo aver spostato i file di origine in un progetto condiviso. Cosa devo fare?

R: Passaggio 2.4 dell'esempio di Image Optimizer illustra come aggiungere file VSCT come elementi collegati in modo che vengano compilati nel file VSCT.

Seguire un esempio dettagliato, ImageOptimizer, con collegamenti al progetto e modifiche al codice per ogni passaggio.