Condividi tramite


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 minori che non richiederanno di seguire i consigli sulla modernizzazione dell'estensione presenti 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 da Visual Studio 2022 scarica.

Estensioni scritte in un linguaggio .NET

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

  • Il metapacchetto Microsoft.VisualStudio.Sdk (versioni 17.x) include la maggior parte o tutti gli assembly di riferimento necessari.
  • Il pacchetto pacchetto Microsoft.VSSDK.BuildTools (versioni 17.x) deve essere fatto riferimento dal progetto VSIX in modo che possa compilare un VSIX conforme a Visual Studio 2022.

Anche se non si fa riferimento a modifiche 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 specificamente contro il 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. Effettua il refactoring del codice sorgente in un progetto condiviso per consentire la compatibilità con Visual Studio 2022 e versioni precedenti.
  3. Aggiungere un progetto VSIX mirato a Visual Studio 2022 e una tabella di rimappatura 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, sono non necessarie per seguire i passaggi precedenti, inclusa la produzione di due VSIX distinti.

Modificare invece il vsix in modo che il relativo file source.extension.vsixmanifest 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 il test di .

Nota

Stai creando una nuova estensione di Visual Studio usando Visual Studio 2022 e vuoi supportare anche Visual Studio 2019 o una versione precedente, consulta questa guida.

Attività di MSBuild

Se si creano attività MSBuild, tenere presente che in Visual Studio 2022 è probabile che vengano caricate in un processo di MSBuild.exe a 64 bit. Se l'attività richiede l'esecuzione di un processo a 32 bit, vedere Configurare le destinazioni e le 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 eventuali riferimenti diretti agli assembly di Visual Studio SDK con elementi PackageReference:

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

    Suggerimento

    È possibile sostituire molti riferimenti all'assembly con solo un'istanzaPackageReference 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 che non sono univoci per Visual Studio SDK (ad esempio, Newtonsoft.Json.dll) potrebbero essere stati individuabili tramite un semplice riferimento <Reference Include="Newtonsoft.Json" /> 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. Esamina questi avvisi e risolvi il maggior numero possibile. Prendere in considerazione l'uso di aree di #pragma warning disable <id> nel codice 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 mirare comodamente la tua estensione a Visual Studio 2022 e alle versioni precedenti e 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 di source.extension.vsixmanifest e i riferimenti al pacchetto all'SDK 16.x o 17.x. Questi progetti VSIX avrebbero anche un riferimento condiviso a un nuovo progetto che ospiterà tutto il codice sorgente condivisibile 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, per modernizzare i progetti e 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 selezionare Aggiungi>Nuovo progetto.

    Screenshot che mostra le selezioni per l'aggiunta di un nuovo progetto.

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

    Screenshot che mostra la ricerca e la selezione del modello Progetto condiviso.

  4. Aggiungi un riferimento da ciascun progetto che fa riferimento al Visual Studio SDK alla sua controparte di progetto condiviso.

    Screenshot che mostra le selezioni per l'aggiunta di un riferimento al progetto condiviso.

  5. Spostare tutto il codice sorgente (inclusi i file .cs e .resx) da ciascun progetto che fa riferimento all'SDK di Visual Studio alla sua controparte del progetto condiviso. Lasciare file source.extension.vsixmanifest nel progetto VSIX.

    Screenshot che mostra un progetto condiviso contenente tutti i file di origine.

  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 che mostra le selezioni per l'aggiunta di metadati e file V S C T come file collegati.

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

      Screenshot che mostra l'inclusione dei file di metadati in V S I X.

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

      Screenshot che mostra le proprietà selezionate per un file V S C T.

      Se Visual Studio segnala che questa impostazione non è supportata, è possibile modificare manualmente l'azione di compilazione scaricando il progetto e modificando Content in 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 un target di Visual Studio 2022

Questa sezione presuppone che siano stati completati i passaggi per fattore 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 tuo nuovo progetto VSIX, aggiungi un riferimento allo stesso progetto condiviso a cui fanno riferimento le estensioni VSIX destinate a Visual Studio 2019.

    Screenshot che mostra una soluzione con un progetto condiviso e due progetti VSIX.

  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 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 tuo codice, usa 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 per CPU Any a x64. Questa modifica garantisce che in Visual Studio 2022 l'estensione viene sempre caricata in un processo a 64 bit. anche qualsiasi CPU, 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 di source.extension.vsixmanifest per orientarsi verso Visual Studio 2022. Impostare il tag <InstallationTarget> 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 elemento ProductArchitecture. 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 è fondamentale. 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 istanza di InstallationTarget. 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 eventuali altre modifiche necessarie in source.extension.vsixmanifest in modo che corrisponda a quello destinato 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 VSIX mirata per Visual Studio 2022. È consigliabile compilare il progetto VSIX di Visual Studio 2022 e risolvere eventuali interruzioni di compilazione che si presentano. Congratulazioni se nel progetto VSIX mirato a Visual Studio 2022 non hai interruzioni di compilazione. 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 significative dell'API in Visual Studio 2022.

Quando adatti il tuo codice, ti consigliamo di 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 hai completato la creazione dell'estensione destinata a Visual Studio 2022, passa 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 significative. 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 che mostra la casella per l'immissione di un simbolo di compilazione condizionale.

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 regioni #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 sintassi #if, 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 che mostra la compilazione condizionale in un progetto condiviso.

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 il namespace 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.

Consigliamo vivamente di testare con ogni versione di Visual Studio che si desidera supportare con l'estensione.

Pubblicare l'estensione

Hai aggiunto un target di Visual Studio 2022 al tuo componente aggiuntivo e l'hai testato. A questo momento si è pronti per pubblicare l'estensione per il mondo da ammirare.

Visual Studio Marketplace

La pubblicazione dell'estensione per 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 un VSIX destinato a Visual Studio 2022 e un 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 si avvia vsixinstaller.exe per installare (parte dell'estensione), tieni 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 punti a Visual Studio 2022 e versioni precedenti, dovrai condividere i tuoi VSIX multipli singolarmente. 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 implementazione di un VSIX con dipendenze deve rispecchiare quello delle sue dipendenze.

Q & A

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

A: Sì! Per informazioni su questo argomento, vedi le estensioni senza eseguire codice.

Q: una dipendenza NuGet genera assembly di interoperabilità precedenti e causa classi in conflitto. Cosa dovrei fare?

A: Aggiungi la seguente riga al file .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.

Q: 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 dovrei fare?

A: 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.