Обновление расширения 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, чтобы он смог создать visual Studio 2022-совместимый VSIX.

Даже если вы не ссылаетесь на критические изменения, расширения должны быть скомпилированы с любой платформой ЦП или 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. Щелкните правой кнопкой мыши решение и выберите команду "Добавить>новый проект".

    Screenshot that shows the selections for adding a new project.

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

    Screenshot that shows searching for and selecting the Shared Project template.

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

    Screenshot that shows selections for adding a shared project reference.

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

    Screenshot that shows a shared project containing all source files.

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

    Screenshot that shows selections for adding metadata and V S C T files as linked files.

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

      Screenshot that shows including metadata files in V S I X.

    • Для vsCT-файлов задайте действиесборки в VSCTCompile. Задайте значение "Включить" в VSIX значение False.

      Screenshot that shows selected properties for a V S C T file.

      Если Visual Studio жалуется, что этот параметр не поддерживается, можно вручную изменить действие сборки, выгрузив проект и изменив его на ContentVSCTCompile:

      -<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 добавьте ссылку на тот же общий проект, на который ссылается Visual Studio 2019.

    Screenshot that shows a solution with one shared project and two V S I X projects.

  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. На странице свойств проекта можно задать символ условной компиляции:

Screenshot that shows the box for entering a conditional compilation symbol.

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

Методы 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 для этого расширения и другого.

Screenshot that shows conditional compilation in a shared project.

Методы совместного использования 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. Затем вы можете отправить visual Studio 2022 с целевой версией VSIX и 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 с зависимостями должен зеркало его зависимостей.

Вопросы и ответы

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

Ответ. Да. Сведения об этом см . в расширениях без выполнения кода .

Вопрос. Зависимость NuGet приводит к старым сборкам взаимодействия и вызывает столкновение классов. Что делать?

Ответ. Добавьте следующую строку в CSPROJ-файл , чтобы избежать повторяющихся сборок:

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

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

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

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

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