Обновление расширения 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:
- Модернизация проектов.
- Рефакторинг исходного кода в общий проект , позволяющий использовать Visual Studio 2022 и более ранние версии.
- Добавьте проект VSIX, предназначенный для Visual Studio 2022, и таблицу повторного сопоставления пакетов или сборок.
- Внесите необходимые корректировки кода.
- Проверьте расширение Visual Studio 2022.
- Опубликуйте расширение 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 в расширение, настоятельно рекомендуется очистить и модернизировать существующий проект:
Замените все прямые ссылки на сборки пакета 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:
Если вы еще этого не сделали, модернизируйте проекты, чтобы упростить шаги позже в этом процессе обновления.
Добавьте новый общий проект в решение для каждого существующего проекта, ссылающегося на пакет SDK Visual Studio. Щелкните правой кнопкой мыши решение и выберите команду "Добавить>новый проект".
В диалоговом окне "Добавление нового проекта" найдите общий проект и выберите шаблон общего проекта.
Добавьте ссылку из каждого проекта пакета SDK для Visual Studio, ссылающегося на его общий проект.
Переместите весь исходный код (в том числе .cs и RESX-файлы ) из каждого проекта пакета SDK Для Visual Studio, ссылающегося на его общий проект. Оставьте файл source.extension.vsixmanifest в проекте VSIX.
Переместите файлы метаданных (например, заметки о выпуске, лицензию и значки) и файлы VSCT в общий каталог. Затем добавьте их в виде связанных файлов в проект VSIX. Обратите внимание, что общий каталог отделен от общего проекта.
Для файлов метаданных задайте для действия сборки содержимое. Задайте значение "Включить" в VSIX значение True.
Для vsCT-файлов задайте действие сборки в VSCTCompile. Задайте значение "Включить" в VSIX значение False.
Если 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>
Создайте проект, чтобы убедиться, что вы не внесли никаких ошибок.
Теперь проект готов к добавлению поддержки Visual Studio 2022.
Добавление целевого объекта Visual Studio 2022
В этом разделе предполагается, что вы выполнили действия по фактору расширения Visual Studio с общими проектами.
Добавьте поддержку Visual Studio 2022 в расширение, выполнив следующие действия. Их можно выполнить с помощью Visual Studio 2019.
Добавьте новый проект VSIX в решение. Этот проект предназначен для Visual Studio 2022. Удалите любой исходный код, который пришел с шаблоном, но сохраните файл source.extension.vsixmanifest .
В новом проекте VSIX добавьте ссылку на тот же общий проект, на который ссылается Visual Studio 2019.
Убедитесь, что новый проект VSIX правильно выполняет сборку. Для устранения ошибок компилятора может потребоваться добавить ссылки на соответствие исходному проекту VSIX.
Для управляемых расширений 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 для компиляции.
Для проектов C++ расширения должны компилироваться для AMD64. Для управляемых расширений рекомендуется изменить проект с создания любого ЦП на целевой x64. Это изменение гарантирует, что в Visual Studio 2022 расширение всегда загружается в 64-разрядном процессе. Любой ЦП также хорошо, но он может создавать предупреждения, если вы ссылаетесь на любые собственные двоичные файлы, доступные только для x64.
Любая зависимость, которую может иметь расширение в собственном модуле, должна быть обновлена с образа x86 до образа AMD64.
Измените файл 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
.Внесите любые другие изменения, необходимые в 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. Затем вы можете отправить 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 с ссылками на изменения проекта и кода для каждого шага.