Unterbrechen von API-Änderungen in Visual Studio 2022

Wenn Sie eine Erweiterung zu Visual Studio 2022 migrieren, können sich die hier aufgeführten wichtigen Änderungen auf Sie auswirken.

Referenzassemblys sind nicht mehr installiert

Viele der Assemblys, auf die Sie möglicherweise verweisen, dass MSBuild aus einem Visual Studio-Installationsverzeichnis aufgelöst wurde, nicht mehr installiert sind. Sie sollten NuGet verwenden, um die benötigten Visual Studio SDK-Referenzassemblys abzurufen. Detaillierte Schritte hierzu finden Sie unter "Modernisieren von Projekten ".

Entfernte APIs

In Visual Studio 2022 wurden eine Reihe von APIs im Rahmen der zukünftigen Verschiebung von Visual Studio entfernt. Eine Liste der entfernten APIs finden Sie auf der Seite "Entfernte API-Liste ".

Breaking Changes bei der Interoperabilität

Viele unserer APIs haben sich in Visual Studio 2022 geändert, in der Regel mit einfachen Änderungen, die für Ihren Code einfach sind.

Um die bahnbrechenden Änderungen zu verwalten, planen wir, einen neuen Mechanismus für die Verteilung von Interopassemblys bereitzustellen. Speziell für Visual Studio 2022 und darüber hinaus stellen wir eine einzelne Interopassembly mit Definitionen für viele gängige öffentliche Visual Studio-Schnittstellen bereit. Diese Assembly enthält verwaltete Definitionen für viele Visual Studio-Schnittstellen, die sich von mehreren Interopassemblys entfernen. Die neue Interopassembly wird über das Microsoft.VisualStudio.Interop NuGet-Paket verteilt.

Visual Studio-Komponenten, die in erster Linie in systemeigenen Kontexten verwendet werden und eine geringe Anzahl von unterbrechungsübergreifenden Änderungen aufweisen, verfügen jedoch weiterhin über eigene Interopassemblys (z. B. die Debuggerassembly ist weiterhin VisualStudio.Debugger.Interop.dll wie heute). In jedem Fall können die Assemblys dann von Ihrer Anwendung aus referenziert werden, genau wie sie heute sind.

Dies ist eine erhebliche Änderung und bedeutet, dass Erweiterungen, die APIs in und Assembly verwenden, die in diesem neuen Ansatz integriert sind, nicht mit älteren Versionen von Visual Studio kompatibel sind, die die vorherige Interopassembly verwenden.

Dies hat einige sehr wichtige Vorteile, die das Aktualisieren Ihrer Erweiterung auf Visual Studio 2022 vereinfachen:

  • Alle fehlerhaften APIs werden zu Buildzeitfehlern, wodurch sie einfacher zu finden und zu beheben sind.
  • Sie müssen nur Code aktualisieren, der eine API verwendet, die in Visual Studio 2022 beschädigt wurde.
  • Sie können die alte, jetzt fehlerhafte API nicht versehentlich verwenden.

Insgesamt führen diese Änderungen zu einer stabileren Version von Visual Studio für alle Benutzer. Der Hauptnachteil dieses Ansatzes besteht darin, dass Ihre verwalteten Assemblys nicht sowohl in Visual Studio 2019 als auch in Visual Studio 2022 ausgeführt werden können, ohne den Code einmal für jede Visual Studio-Zielversion zu kompilieren.

Während Sie Kompilierungsfehler aufgrund der API-Unterschiede zwischen Visual Studio 2019 und Visual Studio 2022 durcharbeiten, finden Sie möglicherweise die API oder das Muster, mit denen Sie unten konfrontiert sind, mit Anleitungen zur Behebung.

int oder uint wo IntPtr erwartet wird

Wir erwarten, dass dies ein sehr häufiger Fehler ist. Damit Visual Studio 2022 ein 64-Bit-Prozess wird, mussten einige unserer Interoperabilitäts-APIs behoben werden, bei denen angenommen wurde, dass ein Zeiger in eine 32-Bit-Ganzzahl passen könnte, um tatsächlich einen Zeigerwert zu verwenden.

Beispielfehler:

Argument 3: Kann nicht von 'out uint' in 'out System.IntPtr' konvertieren

Aktualisieren Sie einfach Ihren Code so, dass er erwartet oder bereitgestellt IntPtr wird oder UIntPtr wo bzw. wo int er uint verwendet wird, um den Umbruch aufzulösen.

Beispielkorrektur:

-shell.LoadLibrary(myGuid, myFlags, out uint ptrLib);
+shell.LoadLibrary(myGuid, myFlags, out IntPtr ptrLib);

Ein Interoperabilitätstyp, der in zwei Assemblys definiert ist

Wenn C#-Compiler einen Fehler meldet, dass ein typ, den Sie verwenden, in zwei Assemblys definiert ist, verweisen Sie wahrscheinlich auf eine Assembly aus der Visual Studio 2019-Version des SDK, auf die Sie nicht mehr verweisen sollten.

Beispielfehler:

fehler CS0433: Der Typ "IVsDpiAware" ist in "Microsoft.VisualStudio.Interop" vorhanden. Version=17.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' und 'Microsoft.VisualStudio.Shell.Interop.16.0.DesignTime, Version=16.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a'

In unserer Referenzassembly-Neuzuordnungstabelle erfahren Sie, welcher Assemblyname der bevorzugte Name in Visual Studio 2022 ist. Beachten Sie in Anbetracht der beiden Assemblys, die oben im Beispielfehler benannt sind, und beachten Sie, dass Microsoft.VisualStudio.Interop es sich um den neuen Assemblynamen handelt. Der Fix wäre dann das Entfernen des Verweises auf Microsoft.VisualStudio.Shell.Interop.16.0.DesignTime das Projekt.

In einigen Fällen bieten wir ein Visual Studio 2022-versionsed-Paket für die veraltete Assembly an, die Typweiterleitungen enthält. Wenn dies verfügbar ist, haben Sie die Möglichkeit, den Paketverweis auf die Visual Studio 2022-Version zu aktualisieren , anstatt es zu entfernen. Die Typweiterleitungen lösen den Fehler vom Compiler aus.

Denken Sie daran, dass diese Verweise manchmal durch transitive Paketreferenzen stammen können und daher schwieriger zu entfernen sind als ein direkter Verweis in Ihrer Projektdatei. Stellen Sie in solchen Fällen sicher, dass alle Ihre direkten Paketverweise selbst Visual Studio 2022 SDK-Pakete verwenden. Sie können auf "project.assets.json" verweisen, um die Kette der Pakete zu identifizieren, die für die Bereitstellung der veralteten Assembly verantwortlich sind. Das Aktualisieren eines transitiven Paketverweises auf eine Visual Studio 2022-Version ist so einfach wie die Installation als direkter Verweis.

Wenn Sie die Abhängigkeitsstruktur nicht ändern können (z. B. weil es sich um eine Abhängigkeit von Drittanbietern handelt), können Sie dem Paket vor Visual Studio 2022 einen direkten Paketverweis hinzufügen und diesem PackageReference Element Metadaten hinzufügenExcludeAssets="compile", um den Compilerfehler zu beheben. Bedenken Sie jedoch, dass ihre Erweiterung bei dieser Technik möglicherweise eine Abhängigkeit von einer Vor-Visual Studio 2022-Assembly beibehalten kann und ihre Erweiterung zur Laufzeit fehlfunktioniert.

Fehlender Verweis auf eine Interopassembly

Wenn Sie auf eine Assembly verweisen, die mit dem Pre-Visual Studio 2022 SDK kompiliert wurde, wird möglicherweise ein Fehler beim Fehlen eines Assemblyverweises angezeigt.

Beispielfehler:

Fehler CS0012 Der Typ "IVsTextViewFilter" wird in einer Assembly definiert, auf die nicht verwiesen wird. Sie müssen einen Verweis auf die Assembly "Microsoft.VisualStudio.TextManager.Interop, Version=7.1.40304.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" hinzufügen.

Mithilfe der Referenzassembly-Neuzuordnungstabelle können Sie bestätigen, dass die angeforderte Assembly tatsächlich nicht auf sie verweisen muss.

Der beste Fix besteht darin, Ihre Abhängigkeit auf eine Version zu aktualisieren, die mit dem Visual Studio 2022 SDK kompiliert wurde, sodass die entfernte Interopassembly vom Compiler nicht mehr angefordert wird.

In einigen Fällen bieten wir ein Visual Studio 2022-versionsed-Paket für die veraltete Assembly an, die Typweiterleitungen enthält. Wenn dies verfügbar ist, haben Sie die Möglichkeit, einen Paketverweis auf die Visual Studio 2022-Version des veralteten Pakets hinzuzufügen, damit die Typweiterleitung den Fehler vom Compiler beheben wird.

IAsyncServiceProvider fehlt

Es gibt zwei Definitionen dieser Schnittstelle in zwei Namespaces. Nur eine davon war für den verwalteten Verbrauch vorgesehen.

Visual Studio 2019-Namespace Visual Studio 2022-Namespace Verwendungszweck
Microsoft.VisualStudio.Shell.IAsyncServiceProvider Microsoft.VisualStudio.Shell.IAsyncServiceProvider Verwalteter Codeverbrauch
Microsoft.VisualStudio.Shell.Interop.IAsyncServiceProvider Microsoft.VisualStudio.Shell.COMAsyncServiceProvider.IAsyncServiceProvider Nur Interoperabilität auf niedriger Ebene

Wenn ein Fehler angezeigt IAsyncServiceProviderwird, kann es sein, dass Sie den für systemeigenen Code vorgesehenen (die zweite Zeile) verwendet haben. Wenn ja, können Sie auf den neuen Namespace aktualisieren oder zur benutzerfreundlicheren Schnittstelle wechseln.

DTE und _DTE Fehler beim Typ cast

DTE und _DTE sind beide Schnittstellen. Eine leitet sich von der anderen ab. In Visual Studio 2022 werden jedoch die Basis- und abgeleiteten Typen ausgetauscht. Dadurch werden bestimmte Typzuweisungen oder Umwandlungen fehlschlagen.

Dies bedeutet auch, wo Sie die Verwendung new DTE()verwendet haben, müssen Sie jetzt verwenden new _DTE().

Verwenden Sie DTE2 stattdessen den EnvDTE80 Namespace, um die meisten Probleme mit diesem Problem zu beheben.

Fehlendes Argument für einen Methodenaufruf

Einige Methoden deklarieren keine Standardargumente mehr für optionale Parameter in der Interop-API. Wenn Sie einen Fehler bezüglich eines fehlenden Arguments für einen COM-Interoperabilitätsaufruf erhalten und der Parameter einen object Typ aufruft, ist der vorherige Standardwert, den die von der visual Studio 2019-Interoperabilitäts-API definierte Interop-API möglicherweise vorhanden ist "", und erwägen Sie "" daher, als Argument hinzuzufügen, um den Kompilierungsfehler zu beheben.

Wenn Sie zweifeln, was das Standardargument ist, versuchen Sie, den Sprachdienstkontext von Visual Studio 2022 zu Visual Studio 2019 zu wechseln, damit Sie IntelliSense mit den älteren Interopassemblys abrufen, um zu sehen, was das Standardargument war, und fügen Sie ihn dann explizit zu Ihrem Code hinzu. Es funktioniert weiterhin einwandfrei, wenn es für Visual Studio 2019 kompiliert wird, aber jetzt für Visual Studio 2022 kompiliert wird.

Beispielkorrektur:

-process4.Attach2();
+process4.Attach2("");

Veraltete Api für die Suche

Als Teil unserer Bemühungen, die Suche in Dateien zu modernisieren, haben wir veraltete Unterstützung für die folgenden APIs der EnvDTE-Schnittstelle in VS 2022.

Diese APIs funktionieren nicht mehr in VS 2022 und darüber hinaus. Die Anleitung besteht darin, stattdessen IFinder Interface (Microsoft.VisualStudio.Text.Operations) zu verwenden, die methoden für sie suchen und ersetzen. Der Zugriff auf ein Objekt, das die IFinder-Schnittstelle implementiert, kann über die IFindService.CreateFinderFactory-Methode gewonnen werden. Ein Beispiel für die Migration einer Drittanbietererweiterung zu Visual Studio von den älteren APIs zu den modernen IFinder-APIs finden Sie hier: Migrieren der Code maid-Erweiterung von EnvDTE Find and Replace pattern APIs zu modernen IFinder-APIs