Совместное использование пакета SDK для VisualStudio.Extensibility и VSSDK
Хотя модель VisualStudio.Extensibility была создана в основном для размещения расширений за пределами процесса devenv.exe, можно использовать API пакета SDK VisualStudio.Extensibility в расширении, работающем в процессе Visual Studio, и использовать традиционные API расширяемости, предоставляемые пакетами Microsoft.VisualStudio.Sdk .
Поддержка использования в proc предназначена для раннего внедрения новых API-интерфейсов VisualStudio.Extensibility при использовании Microsoft.VisualStudio.Sdk для покрытия любого разрыва функций.
В этом документе описано краткое пошаговое руководство по различным вариантам использования пакета SDK для Расширения VisualStudio.Extensibility in-proc.
Если вы разрабатываете новое расширение, рекомендуется создать расширение VisualStudio.Extension, размещенное в процессе после этого руководства. Этот метод позволяет использовать полные возможности пакета SDK для VisualStudio.Extensibility, а также возможность внедрения служб VSSDK и MEF.
Если у вас есть расширение VSSDK, вы можете следовать этим советам , чтобы использовать новый экземпляр VisualStudioExtensibility в расширении.
Если вы хотите добавить команды, отладить визуализаторы, окна инструментов в существующее расширение VSSDK с помощью пакета SDK для Расширения VisualStudio.Extensibility, можно ознакомиться с этими советами , чтобы разместить расширение VSSDK и расширение Расширения VisualStudio.Extensibility в одном проекте расширения VS.
Создание первого расширения VisualStudio.Extensibility, совместимого с VSSDK
Хотя модель VisualStudio.Extensibility была создана в основном для расширений размещения за пределами процесса devenv.exe, начиная с Visual Studio 2022 17.4 Preview 1, можно создать расширение VisualStudio.Extensibility, размещенное в devenv.exe, и использовать традиционные API расширяемости, предоставляемые пакетами Microsoft.VisualStudio.Sdk .
Необходимые компоненты
- Visual Studio 2022 версии 17.9( предварительная версия 1 или более поздняя версия) с рабочей нагрузкой
Visual Studio extension development
. - Если вы обновляете из предыдущих сборок, удалите VisualStudio.Extensibility Project System, чтобы избежать потенциальных конфликтов.
Создание проекта расширения
- Используйте расширение VisualStudio.Extensibility с шаблоном совместимости пакета SDK VS для создания нового решения.
Отладка расширения
Задайте проект контейнера в качестве запускаемого проекта, нажмите клавишу
F5
, чтобы начать отладку.Нажатие клавиши
F5
создает расширение и развертывает его в экспериментальном экземпляре используемой версии Visual Studio. Отладчик должен присоединиться после загрузки расширения.Команду можно найти в меню, как показано на
Extensions
следующем рисунке:
Использование служб ПАКЕТА SDK Visual Studio из расширения VisualStudio.Extensibility
Проект расширения, совместимый с VS-SDK, ссылается на пакет Microsoft.VisualStudio.Sdk, который позволяет получить доступ ко всем службам пакета SDK Visual Studio.
Традиционно такие службы используются через MEF или AsyncServiceProvider. Вместо этого рекомендуется использовать расширение расширений зависимостей VisualStudio.Extensibility.
Классы MefInjection<TService>
AsyncServiceProviderInjection<TService, TInterface>
(оба из Microsoft.VisualStudio.Extensibility.VSSdkCompatibility
пространства имен) позволяют использовать службы пакета SDK Visual Studio, добавляя их в конструктор класса, экземпляр которого создается путем внедрения зависимостей (например, команды, окна инструментов или части расширения).
В следующем примере показано, как DTE2
можно добавить службы в IBufferTagAggregatorFactoryService
команду.
[VisualStudioContribution]
public class Command1 : Command
{
private TraceSource traceSource;
private AsyncServiceProviderInjection<DTE, DTE2> dte;
private MefInjection<IBufferTagAggregatorFactoryService> bufferTagAggregatorFactoryService;
public Command1(
VisualStudioExtensibility extensibility,
TraceSource traceSource,
AsyncServiceProviderInjection<DTE, DTE2> dte,
MefInjection<IBufferTagAggregatorFactoryService> bufferTagAggregatorFactoryService)
: base(extensibility)
{
this.dte = dte;
this.bufferTagAggregatorFactoryService = bufferTagAggregatorFactoryService;
}
public override CommandConfiguration CommandConfiguration => new("Sample Remote Command")
{
Placements = new[] { CommandPlacement.KnownPlacements.ExtensionsMenu },
Icon = new(ImageMoniker.KnownValues.Extension, IconSettings.IconAndText),
};
Анатомия расширения VisualStudio.Extensibility, совместимого с VSSDK
Несмотря на то, что при использовании расширения расширяемости VisualStudio.Extensibility с шаблоном совместимости пакета SDK VS необходимо настроить все решение, полезно знать, какие основные компоненты расширения VisualStudio.Extensibility отличаются от общего варианта, описанного в руководстве по созданию первого расширения.
Проект контейнера
Решение VisualStudio.Extensibility, совместимое с VS-SDK, состоит из двух проектов:
- библиотека классов, которая ссылается на пакеты пакета SDK VisualStudio.Extensibility и Visual Studio и содержит весь код расширения.
- проект VSIX контейнера, используемый для развертывания и отладки расширения.
Это временное решение, в то время как VisualStudio.Extensibility находится в предварительной версии, а окончательная упаковка и разработка развертывания завершены.
Расширитель не должен добавлять код, содержимое или ресурсы в проект контейнера. Единственной целью проекта контейнера является включение ресурсов, предоставляемых другим проектом.
TargetFramework
Проект расширения и проект контейнера должны быть нацелены на версию .NET, используемую целевой версией Visual Studio. Для Visual Studio 2022 они должны быть нацелены на платформа .NET Framework 4.7.2.
Требуется свойствоInProcessHosting
Класс Extension
должен быть настроен с RequiresInProcessHosting = true
помощью свойства, определяющего расширение как внутрипроцессное.
[VisualStudioContribution]
internal class MyExtension : Extension
{
public override ExtensionConfiguration? ExtensionConfiguration => new()
{
RequiresInProcessHosting = true,
};
...
Использование VisualStudio.Extensibility из существующих расширений VSSDK
Для существующих расширений VSSDK можно запросить экземпляр VisualStudioExtensibility через поставщика услуг и использовать его методы. Этот метод позволяет использовать новую область поверхности API visualStudio.Extensibility SDK в существующих компонентах. Этот параметр может быть полезен в ситуациях, когда вы хотите использовать новый API для запроса сведений о проекте, управления документами без создания нового расширения на основе VisualStudio.Extensibility.
Ниже приведен пример фрагмента кода, который показывает, как можно использовать VisualStudioExtensibility
в пакете VSSDK:
.csproj
В файле добавьте ссылку на пакет API VisualStudio.Extensibility:
<ItemGroup>
<PackageReference Include="Microsoft.VisualStudio.Extensibility" Version="17.9.23-preview-1" />
</ItemGroup>
- Теперь вы можете запросить экземпляр VisualStudioExtensibility с помощью
GetServiceAsync
метода в пакете или других компонентах:
...
using Microsoft.VisualStudio.Extensibility;
...
public class VSSDKPackage : AsyncPackage
{
protected override async Task InitializeAsync(CancellationToken cancellationToken, IProgress<ServiceProgressData> progress)
{
VisualStudioExtensibility extensibility = await this.GetServiceAsync<VisualStudioExtensibility, VisualStudioExtensibility>();
await extensibility.Shell().ShowPromptAsync("Hello from in-proc", PromptOptions.OK, cancellationToken);
...
}
}
Добавление расширения VisualStudio.Extensibility в существующий проект расширения VSSDK
Если вы также хотите внести свой вклад в такие компоненты, как окна инструментов, прослушиватели редакторов с помощью пакета SDK visualStudio.Extensibility в существующем расширении VSSDK, вам потребуется выполнить дополнительные действия, чтобы создать экземпляр расширения Расширения VisualStudio.Extensibility в проекте.
Для использования пакетов SDK VisualStudio.Extensibility ТРЕБУЕТся стиль
.csproj
ПАКЕТА SDK. Для существующих проектов может потребоваться обновить стиль.csproj
пакета SDK.Удалите ссылку на пакет и
Microsoft.VSSDK.BuildTools
вместо этого добавьте ссылки на пакеты для VisualStudio.Extensibility.
<PackageReference Include="Microsoft.VisualStudio.Extensibility.Sdk" Version="17.9.23-preview-1" />
<PackageReference Include="Microsoft.VisualStudio.Extensibility.Build" Version="17.9.23-preview-1" />
- Добавьте
VssdkCompatibleExtension
свойство в файл проекта, присвойте ему значениеtrue
. Это свойство включает некоторые функции VSSDK для обеспечения совместимости.
<PropertyGroup>
<VssdkCompatibleExtension>true</VssdkCompatibleExtension>
</PropertyGroup>
- Создайте новый класс расширения, наследующий от
Extension
базового класса, и задайте свойство RequiresInProcessHosting , как показано ранее.
Теперь вы можете использовать все возможности VisualStudio.Extensibility вместе с существующим расширением VSSDK.