Modifiche che causano un'interruzione dell'API in Visual Studio 2022
Se si esegue la migrazione di un'estensione a Visual Studio 2022, le modifiche di rilievo elencate di seguito potrebbero influire sull'utente.
Assembly di riferimento non più installati
Molti degli assembly a cui si fa riferimento che MSBuild è stato risolto da una directory di installazione di Visual Studio non sono più installati. È consigliabile usare NuGet per acquisire gli assembly di riferimento di Visual Studio SDK necessari. Per informazioni dettagliate su come eseguire questa operazione, vedere Modernizzare i progetti .
API rimosse
In Visual Studio 2022 sono state rimosse diverse API come parte dello spostamento futuro di Visual Studio. Un elenco delle API rimosse è disponibile nella pagina Elenco API rimosse.
Modifiche che causano un'interruzione dell'interoperabilità
Molte delle API sono state modificate in Visual Studio 2022, in genere con semplici modifiche che sono semplici da soddisfare per il codice.
Per gestire le modifiche di rilievo, si prevede di fornire un nuovo meccanismo per la distribuzione di assembly di interoperabilità. In particolare, per Visual Studio 2022 e versioni successive viene fornito un singolo assembly di interoperabilità con definizioni per molte interfacce pubbliche comuni di Visual Studio. L'assembly contiene definizioni gestite per molte interfacce di Visual Studio che si allontanano da più assembly di interoperabilità. Il nuovo assembly di interoperabilità viene distribuito tramite il Microsoft.VisualStudio.Interop
pacchetto NuGet.
Tuttavia, i componenti di Visual Studio usati principalmente nei contesti nativi e che hanno un numero ridotto di modifiche di rilievo continueranno ad avere assembly di interoperabilità propri( ad esempio, l'assembly del debugger sarà ancora VisualStudio.Debugger.Interop.dll come lo fa oggi). In ogni caso, è possibile fare riferimento agli assembly dall'applicazione, proprio come sono oggi.
Si tratta di una modifica significativa e significa che le estensioni che usano le API in e l'assembly compilato in questo nuovo approccio non sono compatibili con le versioni precedenti di Visual Studio usando l'assembly di interoperabilità precedente.
Questo presenta alcuni vantaggi molto importanti che semplificano l'aggiornamento dell'estensione a Visual Studio 2022:
- Eventuali API interrotte diventeranno errori in fase di compilazione, semplificando la ricerca e la correzione.
- È sufficiente aggiornare il codice che usa un'API interrotta in Visual Studio 2022.
- Non sarà possibile usare accidentalmente l'API obsoleta, ora interrotta.
In generale, queste modifiche genereranno una versione più stabile di Visual Studio per tutti gli utenti. Lo svantaggio principale di questo approccio è che gli assembly gestiti non saranno in grado di essere eseguiti sia in Visual Studio 2019 che in Visual Studio 2022 senza compilare il codice una sola volta per ogni versione di Visual Studio di destinazione.
Man mano che si verificano errori di compilazione dovuti alle differenze api tra Visual Studio 2019 e Visual Studio 2022, è possibile trovare l'API o il modello che si sta riscontrando di seguito con indicazioni su come risolverlo.
int
o uint
dove IntPtr
è previsto
Ci aspettiamo che questo sia un errore molto comune. Per rendere Visual Studio 2022 un processo a 64 bit, alcune delle API di interoperabilità devono essere corrette dove si presuppone che un puntatore possa essere inserito in un numero intero a 32 bit per usare effettivamente un valore di dimensioni del puntatore.
Errore di esempio:
Argomento 3: impossibile convertire da 'out uint' a 'out System.IntPtr'
È sufficiente aggiornare il codice per prevedere o fornire IntPtr
o UIntPtr
dove int
o uint
usare per risolvere l'interruzione.
Correzione di esempio:
-shell.LoadLibrary(myGuid, myFlags, out uint ptrLib);
+shell.LoadLibrary(myGuid, myFlags, out IntPtr ptrLib);
Tipo di interoperabilità definito in due assembly
Quando il compilatore C# segnala un errore che indica che un tipo in uso è definito in due assembly, probabilmente si fa riferimento a un assembly dalla versione di Visual Studio 2019 dell'SDK a cui non è più necessario fare riferimento.
Errore di esempio:
errore CS0433: il tipo 'IVsDpiAware' esiste sia in 'Microsoft.VisualStudio.Interop, Version=17.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' e 'Microsoft.VisualStudio.Shell.Interop.16.0.DesignTime, Version=16.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a'
Fare riferimento alla tabella di mapping dell'assembly di riferimento per vedere quale nome dell'assembly è il nome preferito in Visual Studio 2022.
Considerando i due assembly denominati nell'errore di esempio precedente e esaminando questa tabella, si noti che Microsoft.VisualStudio.Interop
è il nuovo nome dell'assembly. La correzione sarà quindi rimuovere il riferimento a Microsoft.VisualStudio.Shell.Interop.16.0.DesignTime
dal progetto.
In alcuni casi viene offerto un pacchetto con controllo delle versioni di Visual Studio 2022 per l'assembly deprecato che contiene server d'inoltro dei tipi. Quando questa opzione è disponibile, è possibile aggiornare il riferimento al pacchetto alla versione di Visual Studio 2022 anziché rimuoverla. I server d'inoltro del tipo risolveranno l'errore dal compilatore.
Tenere presente che a volte questi riferimenti possono provenire da riferimenti transitivi al pacchetto e pertanto può essere più difficile da rimuovere rispetto a un riferimento diretto effettuato nel file di progetto. In questi casi, assicurarsi che tutti i riferimenti diretti al pacchetto usino tutti i pacchetti SDK di Visual Studio 2022. È possibile fare riferimento a project.assets.json per identificare la catena di pacchetti responsabili dell'introduzione dell'assembly deprecato. L'aggiornamento di un riferimento transitivo al pacchetto a una versione di Visual Studio 2022 è semplice quanto l'installazione come riferimento diretto.
Se non è possibile modificare l'albero delle dipendenze, ad esempio perché comporta una dipendenza di terze parti, è possibile aggiungere un riferimento diretto al pacchetto precedente a Visual Studio 2022 e aggiungere ExcludeAssets="compile"
metadati a tale PackageReference
elemento per risolvere l'errore del compilatore. Tenere tuttavia presente che con questa tecnica, l'estensione potrebbe mantenere una dipendenza da un assembly precedente a Visual Studio 2022 e l'estensione potrebbe non funzionare correttamente in fase di esecuzione.
Riferimento mancante a un assembly di interoperabilità
Quando si fa riferimento a un assembly compilato in base all'SDK precedente a Visual Studio 2022, è possibile che venga visualizzato un errore relativo alla mancanza di un riferimento all'assembly.
Errore di esempio:
Errore CS0012 Il tipo 'IVsTextViewFilter' è definito in un assembly a cui non viene fatto riferimento. È necessario aggiungere un riferimento all'assembly 'Microsoft.VisualStudio.TextManager.Interop, Version=7.1.40304.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a'
Usando la tabella di mapping dell'assembly di riferimento, è possibile verificare che l'assembly richiesto non sia effettivamente necessario fare riferimento.
La correzione migliore consiste nell'aggiornare la dipendenza a una versione compilata con Visual Studio 2022 SDK in modo che l'assembly di interoperabilità rimosso non venga più richiesto dal compilatore.
In alcuni casi viene offerto un pacchetto con controllo delle versioni di Visual Studio 2022 per l'assembly deprecato che contiene server d'inoltro dei tipi. Quando questa opzione è disponibile, è possibile aggiungere un riferimento al pacchetto alla versione di Visual Studio 2022 del pacchetto obsoleto, in modo che i server d'inoltro dei tipi risolvono l'errore dal compilatore.
IAsyncServiceProvider
manca
Esistono due definizioni di questa interfaccia, in due spazi dei nomi. Solo uno di questi era destinato al consumo gestito.
Spazio dei nomi di Visual Studio 2019 | Spazio dei nomi di Visual Studio 2022 | Uso previsto |
---|---|---|
Microsoft.VisualStudio.Shell.IAsyncServiceProvider | Microsoft.VisualStudio.Shell.IAsyncServiceProvider | Utilizzo del codice gestito |
Microsoft.VisualStudio.Shell.Interop.IAsyncServiceProvider | Microsoft.VisualStudio.Shell.COMAsyncServiceProvider.IAsyncServiceProvider | solo interoperabilità di basso livello |
Se viene visualizzato un errore relativo a IAsyncServiceProvider
, è possibile che si usasse quello destinato al codice nativo (la seconda riga).
In tal caso, è possibile eseguire l'aggiornamento al nuovo spazio dei nomi o passare all'interfaccia più gestita.
DTE
errori di cast del tipo e _DTE
DTE
e _DTE
sono entrambe interfacce. Uno deriva dall'altro. Tuttavia, in Visual Studio 2022, i tipi di base e derivati vengono scambiati.
In questo modo, alcune assegnazioni di tipo o cast hanno esito negativo.
Questo significa anche dove è stato usato per usare new DTE()
, è ora necessario usare new _DTE()
.
Per attenuare la maggior parte dei problemi, usare DTE2
invece dallo spazio dei EnvDTE80
nomi .
Argomento mancante in una chiamata al metodo
Alcuni metodi non dichiarano più gli argomenti predefiniti per i parametri facoltativi nell'API di interoperabilità. Se viene visualizzato un errore relativo a un argomento mancante per una chiamata di interoperabilità COM e il parametro chiama un object
tipo, il valore predefinito precedente definito dall'API di interoperabilità di Visual Studio 2019 potrebbe essere , ""
quindi prendere in considerazione l'aggiunta ""
come argomento per risolvere l'errore di compilazione.
In caso di dubbi sull'argomento predefinito usato, provare a cambiare il contesto del servizio di linguaggio da Visual Studio 2022 a Visual Studio 2019 in modo da ottenere IntelliSense con gli assembly di interoperabilità meno recenti per visualizzare l'argomento predefinito e quindi aggiungerlo in modo esplicito al codice. Continuerà a funzionare correttamente quando viene compilato per Visual Studio 2019, ma verrà ora compilato per Visual Studio 2022.
Correzione di esempio:
-process4.Attach2();
+process4.Attach2("");
Deprecazione dell'API di ricerca legacy
Come parte dei nostri sforzi per modernizzare la ricerca nei file, abbiamo deprecato il supporto per le API seguenti dell'interfaccia EnvDTE in VS 2022.
- EditPoint.FindPattern(String, Int32, EditPoint, TextRanges)
- EditPoint.ReplacePattern(TextPoint, String, String, Int32, TextRanges)
- EditPoint.ReplaceText(Object, String, Int32)
- TextSelection.FindText(String, Int32)
- TextSelection.FindPattern(String, Int32, TextRanges)
- TextSelection.ReplaceText(String, String, Int32)
- TextSelection.ReplacePattern(String, String, Int32, TextRanges)
- TextDocument.ReplacePattern(String, String, Int32, TextRanges)
- TextDocument.ReplaceText(String, String, Int32)
Queste API non funzioneranno più in VS 2022 e versioni successive. Il materiale sussidiario consiste nell'usare l'interfaccia IFinder (Microsoft.VisualStudio.Text.Operations) che include metodi di ricerca e sostituzione. L'accesso a un oggetto che implementa l'interfaccia IFinder può essere ottenuto tramite il metodo IFindService.CreateFinderFactory. Un esempio di migrazione di un'estensione di terze parti a Visual Studio dalle API precedenti alle API IFinder moderne è disponibile qui: Eseguire la migrazione dell'estensione Code Maid da EnvDTE Find and Replace pattern APIs to modern IFinder APIs