Поделиться через


Критические изменения API в Visual Studio 2022

Если вы переносите расширение в Visual Studio 2022, критические изменения, перечисленные здесь, могут повлиять на вас.

Ссылочные сборки больше не установлены

Многие сборки, которые вы могли ссылаться на то, что MSBuild, разрешенный из каталога установки Visual Studio, больше не установлены. Для получения необходимых сборок пакета SDK для Visual Studio следует использовать NuGet. Подробные инструкции по этому выполнению см. в разделе "Модернизация проектов ".

Удаленные API

В Visual Studio 2022 ряд API были удалены в процессе перемещения Visual Studio. Список удаленных API можно найти на странице списка удаленных API .

Критические изменения во взаимодействии

Многие из наших API изменились в Visual Studio 2022, как правило, с простыми изменениями, которые просты для вашего кода для удовлетворения.

Для управления критическими изменениями мы планируем предоставить новый механизм распределения сборок взаимодействия. В частности, для Visual Studio 2022 и за ее пределами мы предоставляем одну сборку взаимодействия с определениями для многих общих общедоступных интерфейсов Visual Studio. Эта сборка содержит управляемые определения для многих интерфейсов Visual Studio, отключающихся от нескольких сборок взаимодействия. Новая сборка взаимодействия распространяется через Microsoft.VisualStudio.Interop пакет NuGet.

Однако компоненты Visual Studio, которые в основном используются в собственных контекстах и имеют небольшое количество критических изменений, по-прежнему будут иметь собственные сборки взаимодействия (например, сборка отладчика по-прежнему будет visualStudio.Debugger.Interop.dll, как и сейчас). В любом случае сборки можно ссылаться из приложения так же, как и сегодня.

Это значительное изменение и означает, что расширения, использующие API и сборки, встроенные в этот новый подход, несовместимы с более старыми версиями Visual Studio с помощью предыдущей сборки взаимодействия.

Это имеет несколько важных преимуществ, которые упрощают обновление расширения до Visual Studio 2022.

  • Любые неработающие API становятся ошибками времени сборки, что упрощает поиск и исправление.
  • Вам нужно обновить только код, использующий API, который был нарушен в Visual Studio 2022.
  • Вы не сможете случайно использовать старый, теперь сломанный API.

В целом эти изменения приводят к более стабильной версии Visual Studio для всех пользователей. Основным недостатком этого подхода является то, что управляемые сборки не смогут выполняться как в Visual Studio 2019, так и в Visual Studio 2022 без компиляции кода один раз для каждой целевой версии Visual Studio.

При работе с ошибками компиляции из-за различий API между Visual Studio 2019 и Visual Studio 2022 вы можете найти API или шаблон, с которыми вы столкнулись ниже, с рекомендациями по ее устранению.

int или uint где IntPtr ожидается

Мы ожидаем, что это будет очень распространенная ошибка. Чтобы сделать Visual Studio 2022 64-разрядным процессом, некоторые из наших API взаимодействия должны быть исправлены, где они предположили, что указатель может соответствовать 32-разрядному целочислению, чтобы фактически использовать значение размера указателя.

Пример сообщения об ошибке:

Аргумент 3. Не удается преобразовать из out uint в "out.IntPtr"

Просто обновите код, чтобы ожидать или указать IntPtr или где или UIntPtr uint где int или где будет разрешаться разрыв.

Пример исправления:

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

Тип взаимодействия, определенный в двух сборках

Когда компилятор C# сообщает об ошибке, что тип, который вы используете, определен в двух сборках, вы, вероятно, ссылаетесь на сборку из visual Studio 2019 версии пакета SDK, на которую больше не следует ссылаться.

Пример сообщения об ошибке:

ошибка CS0433: тип IVsDpiAware существует как в Microsoft.VisualStudio.Interop, Version=17.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f1d50a3a" и "Microsoft.VisualStudio.Shell.Interop.16.0.DesignTime, Version=16.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f1d50a3a'

Ознакомьтесь со ссылкой на таблицу перемачений сборки, чтобы узнать, какое имя сборки является предпочтительным именем в Visual Studio 2022. Учитывая две сборки, именованные в приведенном выше примере ошибки и просматривая эту таблицу, обратите внимание, что Microsoft.VisualStudio.Interop это новое имя сборки. Затем исправление будет удалено ссылку Microsoft.VisualStudio.Shell.Interop.16.0.DesignTime на проект.

В некоторых случаях мы предлагаем пакет с версией Visual Studio 2022 для устаревшей сборки, содержащей серверы пересылки типов. Если это доступно, вы можете обновить ссылку на пакет до версии Visual Studio 2022 вместо удаления. Серверы пересылки типов разрешают ошибку компилятора.

Имейте в виду, что иногда эти ссылки могут поступать по транзитивной ссылке на пакет, и поэтому может быть труднее удалить, чем прямая ссылка, сделанная в файле проекта. В таких случаях убедитесь, что все прямые ссылки на пакеты SDK для Visual Studio 2022 используются самостоятельно. Вы можете обратиться к project.assets.json , чтобы определить цепочку пакетов, ответственных за создание нерекомендуемой сборки. Обновление транзитивного пакета до версии Visual Studio 2022 так же просто, как и установка, как прямая ссылка.

Если вы не можете изменить дерево зависимостей (например, так как оно включает в себя стороннюю зависимость), можно добавить прямую ссылку на пакет до Visual Studio 2022 и добавить ExcludeAssets="compile" метаданные в этот PackageReference элемент, чтобы устранить ошибку компилятора. Но помните, что с помощью этого метода расширение может сохранить зависимость от сборки до Visual Studio 2022, а расширение может не работать во время выполнения.

Отсутствует ссылка на сборку взаимодействия

При ссылке на сборку, скомпилированную в пакете SDK для предварительной версии Visual Studio 2022, может возникнуть ошибка об отсутствии ссылки на сборку.

Пример сообщения об ошибке:

Ошибка CS0012 Тип IVsTextViewFilter определен в сборке, на которую не ссылается ссылка. Необходимо добавить ссылку на сборку Microsoft.VisualStudio.TextManager.Interop, Version=7.1.40304.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a'

Используя таблицу повторного сопоставления эталонной сборки, можно убедиться, что запрошенная сборка на самом деле не должна ссылаться.

Лучшее исправление заключается в обновлении зависимости до версии, скомпилированной с помощью пакета SDK Для Visual Studio 2022, чтобы удаленная сборка взаимодействия больше не запрашивалась компилятором.

В некоторых случаях мы предлагаем пакет с версией Visual Studio 2022 для устаревшей сборки, содержащей серверы пересылки типов. Если это доступно, у вас есть возможность добавить ссылку на пакет в версию устаревшего пакета Visual Studio 2022, чтобы серверы пересылки типов разрешали ошибку компилятора.

IAsyncServiceProvider отсутствует

Существует два определения этого интерфейса в двух пространствах имен. Только одна из них предназначена для управляемого потребления.

Пространство имен Visual Studio 2019 Пространство имен Visual Studio 2022 предполагаемое использование;
Microsoft.VisualStudio.Shell.IAsyncServiceProvider Microsoft.VisualStudio.Shell.IAsyncServiceProvider Использование управляемого кода
Microsoft.VisualStudio.Shell.Interop.IAsyncServiceProvider Microsoft.VisualStudio.Shell.COMAsyncServiceProvider.IAsyncServiceProvider только низкоуровневый взаимодействие

Если вы видите ошибку, IAsyncServiceProviderвозможно, вы использовали его для машинного кода (вторая строка). Если это так, вы можете обновить новое пространство имен или переключиться на более управляемый интерфейс.

DTE и _DTE сбои приведения типов

DTE и _DTE оба интерфейса. Один является производным от другого. Однако в Visual Studio 2022 базовые и производные типы переключаются. Это приводит к сбою определенных назначений типов или приведения.

Это также означает, где вы использовались new DTE(), теперь необходимо использовать new _DTE().

Чтобы устранить большинство проблем с этим, используйте DTE2 вместо EnvDTE80 этого пространство имен.

Отсутствующий аргумент для вызова метода

Несколько методов больше не объявляют аргументы по умолчанию для того, что были необязательными параметрами в API взаимодействия. Если вы получите ошибку о отсутствующих аргументах для вызова взаимодействия COM, а также вызовы параметра для object типа, предыдущее значение по умолчанию, определенное ""API взаимодействия Visual Studio 2019, поэтому рекомендуется добавить "" в качестве аргумента, чтобы устранить ошибку компиляции.

Если сомневаться в том, какой аргумент по умолчанию использовался, попробуйте переключить контекст службы языка с Visual Studio 2022 на Visual Studio 2019, чтобы получить Intellisense со старыми сборками взаимодействия, чтобы увидеть, какой аргумент по умолчанию был, а затем явно добавить его в код. Она будет работать нормально при компиляции для Visual Studio 2019, но теперь будет компилироваться для Visual Studio 2022.

Пример исправления:

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

Устаревшая версия api поиска нерекомендуемая версия

В рамках наших усилий по модернизации поиска в файлах мы не рекомендуем использовать следующие API интерфейса EnvDTE в VS 2022.

Эти API больше не будут работать в VS 2022 и более. Руководство заключается в использовании интерфейса IFinder (Microsoft.VisualStudio.Text.Operations), который имеет методы поиска и замены на нем. Доступ к объекту, реализующего интерфейс IFinder, можно получить с помощью метода IFindService.CreateFinderFactory. Пример переноса стороннего расширения в Visual Studio из старых API-интерфейсов в современные API IFinder можно найти здесь: миграция расширения Code Maid из EnvDTE Find и Replace pattern API на современные API IFinder