Istotne zmiany interfejsu API w programie Visual Studio 2022

Jeśli migrujesz rozszerzenie do programu Visual Studio 2022, zmiany powodujące niezgodność wymienione tutaj mogą mieć wpływ na Ciebie.

Zestawy odwołań nie są już zainstalowane

Wiele zestawów, które mogły odwoływać się do tego, że program MSBuild rozpoznany z katalogu instalacyjnego programu Visual Studio nie jest już zainstalowany. Użyj narzędzia NuGet, aby uzyskać potrzebne zestawy ref zestawu VISUAL Studio SDK. Zobacz Modernizuj projekty , aby uzyskać szczegółowe instrukcje dotyczące tego działania.

Usunięte interfejsy API

W programie Visual Studio 2022 usunięto wiele interfejsów API w ramach przenoszenia programu Visual Studio do przodu. Listę usuniętych interfejsów API można znaleźć na stronie Usunięto listę interfejsów API.

Zmiany powodujące niezgodność międzyoperajności

Wiele naszych interfejsów API zmieniło się w programie Visual Studio 2022, zwykle z prostymi zmianami, które są proste w kodzie, aby uwzględnić ten kod.

Aby zarządzać zmianami powodujących niezgodność, planujemy udostępnić nowy mechanizm dystrybucji zestawów międzyoperacyjnych. W szczególności w przypadku programu Visual Studio 2022 i nowszych udostępniamy pojedynczy zestaw międzyoperacyjny z definicjami dla wielu popularnych publicznych interfejsów programu Visual Studio. Ten zestaw zawiera definicje zarządzane dla wielu interfejsów programu Visual Studio odchodzą od wielu zestawów międzyoperacyjnych. Nowy zestaw międzyoperajności jest dystrybuowany za pośrednictwem Microsoft.VisualStudio.Interop pakietu NuGet.

Jednak składniki programu Visual Studio, które są używane głównie w kontekstach natywnych i mają niewielką liczbę zmian powodujących niezgodność, będą nadal miały własne zestawy międzyoperacyjne (na przykład zestaw debugera będzie nadal visualStudio.Debugger.Interop.dll, tak jak obecnie). W każdym przypadku zestawy mogą być następnie przywołyne z aplikacji, tak jak obecnie.

Jest to znacząca zmiana i oznacza, że rozszerzenia korzystające z interfejsów API w zestawie wbudowanym w nowe podejście nie są zgodne ze starszymi wersjami programu Visual Studio przy użyciu poprzedniego zestawu międzyoperacyjnego.

Ma to kilka bardzo ważnych zalet, które ułatwią aktualizowanie rozszerzenia w programie Visual Studio 2022:

  • Wszelkie uszkodzone interfejsy API staną się błędami czasu kompilacji, co ułatwia ich znajdowanie i naprawianie.
  • Wystarczy zaktualizować kod korzystający z interfejsu API, który został uszkodzony w programie Visual Studio 2022.
  • Nie będzie można przypadkowo użyć starego, uszkodzonego interfejsu API.

Ogólnie rzecz biorąc, te zmiany spowodują bardziej stabilną wersję programu Visual Studio dla wszystkich użytkowników. Główną wadą tego podejścia jest to, że zarządzane zestawy nie będą mogły działać zarówno w programach Visual Studio 2019, jak i Visual Studio 2022 bez kompilowania kodu raz dla każdej docelowej wersji programu Visual Studio.

Podczas pracy z błędami kompilacji ze względu na różnice interfejsu API między programem Visual Studio 2019 i programem Visual Studio 2022 możesz znaleźć interfejs API lub wzorzec wymieniony poniżej ze wskazówkami dotyczącymi sposobu jego naprawy.

int lub uint gdzie IntPtr jest oczekiwana

Oczekujemy, że będzie to bardzo typowy błąd. Aby program Visual Studio 2022 był procesem 64-bitowym, niektóre z naszych interfejsów API międzyoperacyjności musiały zostać naprawione, gdy zakładali, że wskaźnik może mieścić się w 32-bitowej liczbą całkowitą, aby faktycznie używać wartości o rozmiarze wskaźnika.

Przykładowy błąd:

Argument 3: nie można przekonwertować z "out uint" na "out System.IntPtr"

Wystarczy zaktualizować kod, aby oczekiwał lub podał IntPtr , UIntPtr gdzie int lub gdzie lub uint był używany, aby rozwiązać ten problem.

Przykładowa poprawka:

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

Typ międzyoperańcowy zdefiniowany w dwóch zestawach

Gdy kompilator języka C# zgłasza błąd, którego używasz, jest zdefiniowany w dwóch zestawach, prawdopodobnie odwołujesz się do zestawu z wersji zestawu Visual Studio 2019 zestawu SDK, do którego nie należy już odwoływać się.

Przykładowy błąd:

błąd CS0433: typ "IVsDpiAware" istnieje w obu elementach "Microsoft.VisualStudio.Interop" Version=17.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" i "Microsoft.VisualStudio.Shell.Interop.16.0.DesignTime, Version=16.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"

Zapoznaj się z naszą tabelą ponownego mapowania zestawu referencyjnego, aby zobaczyć, która nazwa zestawu jest preferowaną nazwą w programie Visual Studio 2022. Biorąc pod uwagę dwa zestawy o nazwie w powyższym przykładowym błędzie i patrząc na tę tabelę, zwróć uwagę, że Microsoft.VisualStudio.Interop jest to nowa nazwa zestawu. Następnie poprawką byłoby usunięcie odwołania do Microsoft.VisualStudio.Shell.Interop.16.0.DesignTime z projektu.

W niektórych przypadkach oferujemy pakiet programu Visual Studio 2022 w wersji dla przestarzałego zestawu zawierającego usługi przesyłania dalej typów. Jeśli jest to dostępne, możesz uaktualnić odwołanie do pakietu do wersji programu Visual Studio 2022 zamiast jej usuwania. Usługi przesyłania dalej typów rozwiążą błąd kompilatora.

Należy pamiętać, że czasami te odwołania mogą pochodzić z przechodniego odwołania do pakietu, co może być trudniejsze do usunięcia niż bezpośrednie odwołanie dokonane w pliku projektu. W takich przypadkach upewnij się, że wszystkie odwołania do pakietów bezpośrednich używają samych pakietów zestawu VISUAL Studio 2022 SDK. Możesz odwołać się do pliku project.assets.json , aby zidentyfikować łańcuch pakietów odpowiedzialnych za wprowadzenie w przestarzałym zestawie. Aktualizowanie odwołania do pakietu przejściowego do wersji programu Visual Studio 2022 jest tak proste, jak zainstalowanie go jako bezpośredniego odwołania.

Jeśli nie możesz zmienić drzewa zależności (na przykład ze względu na zależność innej firmy), możesz dodać bezpośrednie odwołanie do pakietu przed programem Visual Studio 2022 i dodać ExcludeAssets="compile" metadane do tego PackageReference elementu w celu rozwiązania błędu kompilatora. Należy jednak pamiętać, że w przypadku tej techniki rozszerzenie może zachować zależność od zestawu przed programem Visual Studio 2022, a rozszerzenie może działać nieprawidłowo w czasie wykonywania.

Brak odwołania do zestawu międzyoperacyjnej

Podczas odwołwania się do zestawu skompilowanego względem zestawu SDK programu Visual Studio 2022 może wystąpić błąd dotyczący braku odwołania do zestawu.

Przykładowy błąd:

Błąd CS0012 Typ "IVsTextViewFilter" jest zdefiniowany w zestawie, do którego nie odwołuje się odwołanie. Należy dodać odwołanie do zestawu "Microsoft.VisualStudio.TextManager.Interop, Version=7.1.40304.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"

Korzystając z tabeli ponownego mapowania zestawu referencyjnego, możesz potwierdzić, że żądany zestaw nie jest w rzeczywistości jednym, do którego należy się odwołać.

Najlepszym rozwiązaniem jest zaktualizowanie zależności do wersji skompilowanej dla zestawu SDK programu Visual Studio 2022, aby usunięty zestaw międzyoperacyjną nie był już żądany przez kompilator.

W niektórych przypadkach oferujemy pakiet programu Visual Studio 2022 w wersji dla przestarzałego zestawu zawierającego usługi przesyłania dalej typów. Jeśli jest to dostępne, możesz dodać odwołanie do pakietu do wersji programu Visual Studio 2022 przestarzałego pakietu, aby usługi przesyłania dalej typów rozwiązały błąd kompilatora.

IAsyncServiceProvider brak

Istnieją dwie definicje tego interfejsu w dwóch przestrzeniach nazw. Tylko jeden z nich był przeznaczony do użytku zarządzanego.

Przestrzeń nazw programu Visual Studio 2019 Przestrzeń nazw programu Visual Studio 2022 Przeznaczenie
Microsoft.VisualStudio.Shell.IAsyncServiceProvider Microsoft.VisualStudio.Shell.IAsyncServiceProvider Użycie kodu zarządzanego
Microsoft.VisualStudio.Shell.Interop.IAsyncServiceProvider Microsoft.VisualStudio.Shell.COMAsyncServiceProvider.IAsyncServiceProvider tylko międzyoperacyjnego niskiego poziomu

Jeśli zostanie wyświetlony błąd dotyczący IAsyncServiceProviderelementu , może to oznaczać , że używano go dla kodu natywnego (drugi wiersz). Jeśli tak, możesz zaktualizować nową przestrzeń nazw lub przełączyć się do bardziej przyjaznego dla zarządzania interfejsu.

DTEbłędy rzutowania typów i _DTE

DTE i _DTE są interfejsami. Jeden pochodzi od drugiego. Jednak w programie Visual Studio 2022 typy podstawowe i pochodne są zamieniane. Dzięki temu niektóre przypisania typu lub rzutowanie kończą się niepowodzeniem.

Oznacza to również, gdzie użyto polecenia new DTE(), należy teraz użyć polecenia new _DTE().

Aby rozwiązać większość problemów z tym problemami, użyj zamiast tego z DTE2EnvDTE80 przestrzeni nazw.

Brak argumentu w wywołaniu metody

Kilka metod nie deklaruje już domyślnych argumentów dla parametrów opcjonalnych w interfejsie API międzyoperacyjności. Jeśli wystąpi błąd dotyczący brakującego argumentu dla wywołania międzyoperamentowego modelu COM, a parametr wywołuje object typ, poprzednia wartość domyślna zdefiniowana przez interfejs API międzyoperamentowego programu Visual Studio 2019 mogła mieć ""wartość , dlatego rozważ dodanie "" jako argumentu w celu rozwiązania błędu kompilacji.

Jeśli masz wątpliwości co do tego, jaki argument domyślny był używany, spróbuj przełączyć kontekst usługi językowej z programu Visual Studio 2022 do programu Visual Studio 2019, aby uzyskać funkcję IntelliSense ze starszymi zestawami międzyoperacyjnymi, aby zobaczyć, jaki był argument domyślny, a następnie dodać go jawnie do kodu. Będzie ona nadal działać prawidłowo podczas kompilowania dla programu Visual Studio 2019, ale teraz zostanie skompilowana dla programu Visual Studio 2022.

Przykładowa poprawka:

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

Wycofanie starszego interfejsu API znajdowania

W ramach naszych wysiłków związanych z modernizacją funkcji znajdowania w plikach przestaliśmy obsługiwać następujące interfejsy API interfejsu EnvDTE w programie VS 2022.

Te interfejsy API nie będą już działać w programie VS 2022 i nowszym. Wskazówki dotyczą używania interfejsu IFinder (Microsoft.VisualStudio.Text.Operations), który zawiera metody znajdowania i zastępowania. Dostęp do obiektu implementowanego interfejsu IFinder można uzyskać za pośrednictwem metody IFindService.CreateFinderFactory. Przykład migrowania rozszerzenia innej firmy do programu Visual Studio ze starszych interfejsów API do nowoczesnych interfejsów API usługi IFinder można znaleźć tutaj: Migrowanie rozszerzenia Code Maid z interfejsów API wyszukiwania i zastępowania wzorca envDTE do nowoczesnych interfejsów API usługi IFinder