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


Обновление расширения Visual Studio для Visual Studio 2022

Важный

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

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

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

Установка расширений Visual Studio и компиляция

Установите Visual Studio 2022 из загрузки Visual Studio 2022.

Расширения, написанные на языке .NET

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

  • Метапакет Microsoft.VisualStudio.Sdk (версии 17.x) включает в себя большинство или все необходимые эталонные сборки.
  • На пакет microsoft.VSSDK.BuildTools (версии 17.x) следует ссылаться в проекте VSIX, чтобы он смог создать VSIX, совместимую с Visual Studio 2022.

Даже если вы не ссылаетесь на критические изменения, расширения должны быть скомпилированы для Any CPU или платформы x64. Платформа x86 несовместима с 64-разрядным процессом в Visual Studio 2022.

Расширения, написанные на C++

Пакет SDK Visual Studio для расширений, скомпилированных с помощью C++, доступен с установленным пакетом SDK Visual Studio, как обычно.

Даже если вы не ссылаетесь на критические изменения, расширения и должны быть скомпилированы специально для пакета SDK Visual Studio 2022 и платформы AMD64.

Расширения с запущенным кодом

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

Узнайте, как перенести расширения для более ранних версий Visual Studio в Visual Studio 2022:

  1. Модернизируйте ваши проекты.
  2. Переработайте ваш исходный код в общий проект, чтобы дать возможность работать в Visual Studio 2022 и более ранних версиях.
  3. Добавление проекта VSIX для Visual Studio 2022 и таблицы перемеченийтаблицы сборки.
  4. внести необходимые корректировки кода.
  5. Протестируйте расширение Visual Studio 2022.
  6. Опубликовать расширение Visual Studio 2022.

Расширения без выполнения кода

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

Вместо этого измените один VSIX таким образом, чтобы его source.extension.vsixmanifest-файл объявлял два целевых объекта установки:

<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>

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

Заметка

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

Задачи MSBuild

Если вы создаете задачи MSBuild, помните, что в Visual Studio 2022, скорее всего, они будут загружены в 64-разрядном процессе MSBuild.exe. Если для выполнения задачи требуется 32-разрядный процесс, см. раздел Настройка целевых объектов и задач, чтобы убедиться, что MSBuild загружает задачу в 32-разрядном процессе.

Модернизация проекта VSIX

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

  1. переход с packages.config на PackageReference.

  2. Замените любые прямые ссылки на сборки SDK Visual Studio на элементы PackageReference.

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

    Совет

    Можно заменить много ссылок на сборку только один экземплярPackageReference для метапакета:

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

    Обязательно выберите версии пакетов, соответствующие минимальной версии Visual Studio, на которую вы нацелены.

Некоторые сборки, которые не являются уникальными для пакета SDK Visual Studio (например, Newtonsoft.Json.dll) могут быть обнаружены с помощью простой ссылки на <Reference Include="Newtonsoft.Json" /> до Visual Studio 2022. Но в Visual Studio 2022 вместо этого им требуется ссылка на пакет. Причина в том, что некоторые каталоги среды выполнения и пакета SDK Visual Studio были удалены из пути поиска сборки по умолчанию в MSBuild.

При переключении с прямых ссылок на сборки на ссылки на пакеты NuGet можно получить дополнительные ссылки на сборки и пакеты анализаторов, так как NuGet автоматически устанавливает транзитивное закрытие зависимостей. Обычно это нормально, но это может привести к дополнительным предупреждениям во время сборки. Выполните эти предупреждения и устраните столько, сколько вы можете. Рекомендуется использовать в коде #pragma warning disable <id> регионы для подавления предупреждений, которые невозможно устранить.

Использование общих проектов для многонацеливания

Общие проекты — это тип проекта, представленный в Visual Studio 2015. Общие проекты в Visual Studio позволяют совместно использовать файлы исходного кода между несколькими проектами и создавать по-разному с помощью символов условной компиляции и уникальных наборов ссылок.

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

В контексте расширений Visual Studio можно использовать один проект VSIX для Visual Studio 2022 и более поздней версии, а также один проект VSIX для Visual Studio 2019 и более ранних версий. Каждый из этих проектов содержал бы только экземпляр source.extension.vsixmanifest и ссылки на пакет либо SDK 16.x, либо SDK 17.x. Эти проекты VSIX также будут иметь общую ссылку на проект, который будет размещать весь исходный код, который может использоваться в двух версиях Visual Studio.

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

Все эти действия можно выполнить с помощью Visual Studio 2019:

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

  2. Добавьте новый общий проект в решение для каждого существующего проекта, ссылающегося на пакет SDK Visual Studio. Щелкните правой кнопкой мыши на решении и выберите Добавить>Новый проект.

    снимок экрана, на котором показаны выбранные варианты для добавления нового проекта.

  3. В диалоговом окне Добавление нового проекта найдите Общий проект, а затем выберите шаблон Общий Проект.

    снимок экрана, на котором показано поиск и выбор шаблона общего проекта.

  4. Добавьте ссылку от каждого проекта, ссылающегося на SDK для Visual Studio, к соответствующему общему проекту.

    снимок экрана, на котором показаны выборы для добавления ссылки на общий проект.

  5. Переместите весь исходный код (включая .cs и .resx файлы) из каждого проекта с ссылкой на SDK Visual Studio в соответствующий общий проект. Оставьте файл source.extension.vsixmanifest в проекте VSIX.

    снимок экрана, на котором показан общий проект, содержащий все исходные файлы.

  6. Переместите файлы метаданных (например, заметки о выпуске, лицензию и значки) и файлы VSCT в общий каталог. Затем добавьте их в виде связанных файлов в проект VSIX. Обратите внимание, что общий каталог отделен от общего проекта.

    снимок экрана, показывающий выбор для добавления метаданных и файлов V S C T в качестве связанных файлов.

    • Для файлов метаданных задайте действие сборкисодержимого. Установите для включение в VSIX на значение True.

      снимок экрана, показывающий включение файлов метаданных в V S I X.

    • Для файлов VSCT установите параметр сборки в значение VSCTCompile. Установите , чтобы включить в VSIX, значение false для .

      снимок экрана, на котором показаны выбранные свойства для файла V S C T.

      Если Visual Studio жалуется, что этот параметр не поддерживается, можно вручную изменить действие сборки, выгрузив проект и изменив Content на 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. Создайте проект, чтобы убедиться, что вы не внесли никаких ошибок.

Теперь проект готов к добавлению поддержки Visual Studio 2022.

Добавление целевого объекта Visual Studio 2022

В этом разделе предполагается, что вы выполнили действия по фактор расширения Visual Studio с общими проектами.

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

  1. Добавьте в решение новый проект VSIX. Этот проект предназначен для Visual Studio 2022. Удалите любой исходный код, который пришел с шаблоном, но сохраните файл source.extension.vsixmanifest.

  2. В вашем новом проекте VSIX добавьте ссылку на тот же общий проект, на который ссылается VSIX, предназначенный для Visual Studio 2019.

    скриншот, который показывает решение с одним общим проектом и двумя проектами V S I X.

  3. Убедитесь, что новый проект VSIX корректно выполняет сборку. Для устранения ошибок компилятора может потребоваться добавить ссылки на соответствие исходному проекту VSIX.

  4. Для управляемых расширений Visual Studio обновите ссылки на пакет с версии 16.x (или более ранних версий) до версий пакетов 17.x в файле проекта, ориентированном на Visual Studio 2022. Используйте диспетчер пакетов NuGet или непосредственно измените файл проекта:

    -<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" />
    

    Версии, показанные в предыдущем коде, предназначены только для демонстрации. В коде используйте версии, доступные на веб-сайте NuGet .

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

    Расширения, написанные на C++, еще не имеют доступного пакета SDK для компиляции.

  5. Для проектов C++ расширения должны компилироваться для AMD64. Для управляемых расширений рекомендуется изменить проект из сборки для любой ЦП на x64. Это изменение гарантирует, что в Visual Studio 2022 расширение всегда загружается в 64-разрядном процессе. Любая ЦП подходит тоже, но при ссылке на любые собственные двоичные файлы, предназначенные только для x64, возможно могут создаваться предупреждения.

    Любая зависимость вашего расширения от нативного модуля должна быть обновлена с образа x86 до образа AMD64.

  6. Измените файл source.extension.vsixmanifest с учетом Visual Studio 2022. Задайте тег <InstallationTarget>, чтобы указать Visual Studio 2022. Установите элемент ProductArchitecture, чтобы указать нагрузку AMD64.

    <InstallationTarget Id="Microsoft.VisualStudio.Community" Version="[17.0,18.0)">
       <ProductArchitecture>amd64</ProductArchitecture>
    </InstallationTarget>
    

    Важный

    В Visual Studio 2019 конструктор этого файла не предоставляет новый элемент ProductArchitecture. Чтобы внести это изменение, необходимо использовать редактор XML. Чтобы получить доступ к редактору XML, перейдите в обозреватель решений и выберите команду Открыть с помощью.

    Элемент ProductArchitecture имеет решающее значение. Visual Studio 2022 не установит расширение без него.

    Элемент Ценность Описание
    ProductArchitecture x86, amd64 Платформы, которые поддерживает этот VSIX. Без учета регистра. Для каждого элемента используйте одну платформу, а для каждого экземпляра InstallationTarget – один элемент. Для версий продукта младше 17.0 значение по умолчанию — x86, и оно может быть опущено. Для продуктов версии 17.0 и более поздних версий этот элемент является обязательным, и значение по умолчанию отсутствует. Для Visual Studio 2022 единственным допустимым содержимым для этого элемента является amd64.
  7. Внесите другие изменения, необходимые в source.extension.vsixmanifest, чтобы соответствовать тому, который предназначен для Visual Studio 2019 (при наличии).

    Если вы публикуете две версии расширения, предназначенные для каждой другой версии Visual Studio, убедитесь, что идентификатор VSIX в элементе Identity манифеста отличается для каждого расширения.

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

Обработка критических изменений API

Критические изменения API могут требовать обновления кода, запущенного в более ранних версиях Visual Studio. Советы по обновлению кода см. в статье Критические изменения API в Visual Studio 2022.

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

Когда у вас будет сборка расширения, нацеленная на Visual Studio 2022, переходите к тестированию .

Использование символов условной компиляции

Если вы хотите использовать тот же исходный код, даже один и тот же файл для Visual Studio 2022 и более ранних версий, может потребоваться использовать условную компиляцию. Затем вы можете форкнуть код, чтобы адаптироваться к ломающим изменениям. Условная компиляция — это функция языков C#, Visual Basic и C++. Его можно использовать для повторного использования большинства кода с учетом различий в API в определенных местах.

Дополнительные сведения об использовании директив препроцессора и символов условной компиляции см. в директивах препроцессора C#.

Для проектов, предназначенных для более ранних версий Visual Studio, потребуется условный символ компиляции. Затем этот символ можно использовать для создания ветки кода для использования разных API. На странице свойств проекта можно задать символ условной компиляции:

снимок экрана, на котором показано поле для ввода символа условной компиляции.

Не забудьте задать символ компиляции для всех конфигураций. По умолчанию символ, который вы вводите, может применяться только к одной конфигурации.

Методы C#

Символ компиляции можно использовать в качестве директивы препроцессора (#if), как показано в следующем коде. Затем можно сделать форк кода, чтобы справиться с несовместимым изменением между версиями 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

В некоторых случаях можно использовать var, чтобы избежать именования типа и необходимости в регионах #if. Предыдущий фрагмент кода также можно написать следующим образом:

    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);

При использовании синтаксиса #if обратите внимание, как можно использовать раскрывающийся список для контекста службы языка для изменения выделения синтаксиса. Другой раскрывающийся список помогает службе языков сосредоточить внимание на одной целевой версии Visual Studio для этого расширения по сравнению с другой.

снимок экрана, на котором показана условная компиляция в общем проекте.

Методы совместного использования XAML

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

В некоторых случаях ссылка на тип, который существует в разных сборках в Visual Studio 2022 и более ранних версиях, по-прежнему может быть представлена в одном XAML-файле. Удалите пространство имен, ссылающееся на сборку:

-xmlns:vsui="clr-namespace:Microsoft.VisualStudio.PlatformUI;assembly=Microsoft.VisualStudio.Shell.14.0"
-Value="{DynamicResource {x:Static vsui:TreeViewColors.SelectedItemActiveBrushKey}}"
+Value="{DynamicResource TreeViewColors.SelectedItemActiveBrushKey}"

Тестирование расширения

Чтобы протестировать расширение, предназначенное для Visual Studio 2022, необходимо установить Visual Studio 2022. Вы не сможете запускать 64-разрядные расширения в более ранних версиях Visual Studio.

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

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

Опубликуйте ваше расширение

Вы добавили целевой объект Visual Studio 2022 в расширение и проверили его. Теперь вы готовы опубликовать расширение на всеобщее обозрение.

Visual Studio Marketplace

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

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

Настраиваемый установщик

Если вы создаете MSI-файл или EXE-файл для установки вашего расширения и используете vsixinstaller.exe для установки (части) расширения, учтите, что установщик VSIX в Visual Studio 2022 был обновлен. Разработчикам необходимо использовать версию установщика VSIX, которая поставляется с Visual Studio 2022 для установки расширений в этой версии Visual Studio.

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

Сетевой ресурс

Вы можете поделиться расширением по локальной сети или другим способом. Если вы нацелены на Visual Studio 2022 и более ранние версии, необходимо распространять несколько Ваших пакетов VSIX по отдельности. Присвойте им имена файлов (или поместите их в уникальные папки), которые помогают пользователям узнать, какой VSIX необходимо установить на основе установленной версии Visual Studio.

Зависимости

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

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

Q & A

Q: Моему расширению не требуются изменения взаимодействия, так как оно просто предоставляет данные (например, шаблоны). Можно ли создать одно расширение, которое также включает Visual Studio 2022?

A: Да! Дополнительную информацию об этом см. в разделе , посвященном расширениям без выполнения кода.

Q: зависимость NuGet приводит к устаревшим сборкам для взаимодействия и вызывает конфликт классов. Что мне делать?

A: добавьте следующую строку в файл .csproj, чтобы избежать дублирования сборок.

    <PackageReference Include="<Name of offending assembly>" ExcludeAssets="compile" PrivateAssets="all" />

Этот код не позволит ссылкам на пакеты импортировать старую версию сборки из других зависимостей.

Q: Мои команды и горячие клавиши перестали работать в Visual Studio после того, как я переключил исходные файлы на общий проект. Что мне делать?

A: на шаге 2.4 примера оптимизатора изображений показано, как добавить файлы VSCT в виде связанных элементов, чтобы они были скомпилированы в ваш VSCT-файл.

Выполните пошаговый пример ImageOptimizerс ссылками на изменения проекта и кода для каждого шага.