Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Хотя модель VisualStudio.Extensibility была создана в основном для размещения расширений за пределами процесса devenv.exe, можно использовать API пакета SDK VisualStudio.Extensibility в расширении, работающем в процессе Visual Studio, и использовать традиционные API расширяемости, предоставляемые пакетами Microsoft.VisualStudio.Sdk.
Поддержка использования in-proc предназначена для того, чтобы позволить ранним пользователям новых API-интерфейсов VisualStudio.Extensibility, одновременно полагаясь на Microsoft.VisualStudio.Sdk для устранения любых недостающих функций.
В этом документе дан краткий обзор различных вариантов использования пакета VisualStudio.Extensibility SDK (in-proc).
Если вы разрабатываете новое расширение, мы рекомендуем создать расширение VisualStudio.Extension, размещенное в процессе после этого руководства. Этот метод позволяет использовать полные возможности пакета SDK для VisualStudio.Extensibility, а также возможность внедрения служб VSSDK и MEF.
Если у вас есть расширение VSSDK, вы можете следовать этим советам, чтобы использовать новый экземпляр VisualStudioExtensibility в своем расширении.
Если вы хотите добавить команды, визуализаторы отладки и окна инструментов в существующее расширение VSSDK, используя SDK для VisualStudio.Extensibility, вы можете обратиться к этим советам для размещения расширения VSSDK и расширения VisualStudio.Extensibility в одном проекте расширения Visual Studio.
Создание первого расширения VisualStudio.Extensibility, совместимого с VSSDK
Хотя модель VisualStudio.Extensibility была создана в основном для размещения расширений вне процесса devenv.exe, начиная с Visual Studio 2022 17.4 (предварительная версия 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 с шаблоном совместимости VSSDK для создания нового решения.
Отладка расширения
Нажмите
F5
, чтобы начать отладку, это создает расширение и развертывает его в экспериментальном экземпляре используемой версии Visual Studio. Отладчик должен присоединиться после загрузки расширения.Команду можно найти в меню
Extensions
, как показано на следующем рисунке:
Использование служб SDK Visual Studio из расширения VisualStudio.Extensibility
Проект расширения, совместимый с VS-SDK, ссылается на пакет пакета Microsoft.VisualStudio.Sdk, который позволяет получить доступ ко всем службам пакета SDK Visual Studio.
Традиционно такие услуги используются через MEF или AsyncServiceProvider. Вместо этого рекомендуется использовать расширения VisualStudio.Extensibility с внедрением зависимостей .NET.
Классы 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
При использовании шаблона с совместимостью VSSDK для расширения VisualStudio.Extensibility, который берет на себя настройку всего проекта, полезно знать, какие основные компоненты расширения VisualStudio.Extensibility совместимы с VS-SDK и как они отличаются от общего варианта, описанного в руководстве "создание первого расширения".
TargetFramework и VssdkCompatibleExtension
Проект расширения должен использовать версию .NET, используемую целевой версией Visual Studio. Для Visual Studio 2022 они должны использовать .NET Framework 4.7.2.
Проект расширения также должен содержать свойство VssdkCompatibleExtension
, заданное для true
.
<PropertyGroup>
<VssdkCompatibleExtension>true</VssdkCompatibleExtension>
</PropertyGroup>
Требуется свойствоInProcessHosting
Класс Extension
должен быть настроен с помощью свойства RequiresInProcessHosting = true
, определяющего расширение как внутрипроцессное .
[VisualStudioContribution]
internal class MyExtension : Extension
{
public override ExtensionConfiguration? ExtensionConfiguration => new()
{
RequiresInProcessHosting = true,
};
...
Манифест пакета
Проект расширения должен включать манифест пакета с именем source.extension.vsixmanifest
. Тег Installation
должен иметь значение ExtensionType
, установленное в VSSDK+VisualStudio.Extensibility
.
<?xml version="1.0" encoding="utf-8"?>
<PackageManifest Version="2.0.0" xmlns="http://schemas.microsoft.com/developer/vsx-schema/2011" xmlns:d="http://schemas.microsoft.com/developer/vsx-schema-design/2011">
<Metadata>
<Identity Id="MyExtensionId.f14b8c45-154f-4584-abd7-9ec22af003e2" Version="1.0" Language="en-US" Publisher="Microsoft" />
<DisplayName>My extension</DisplayName>
<Description xml:space="preserve">My extension's description.</Description>
</Metadata>
<Installation ExtensionType="VSSDK+VisualStudio.Extensibility">
<InstallationTarget Id="Microsoft.VisualStudio.Community" Version="[17.9,18.0)">
<ProductArchitecture>amd64</ProductArchitecture>
</InstallationTarget>
<InstallationTarget Id="Microsoft.VisualStudio.Community" Version="[17.9,18.0)">
<ProductArchitecture>arm64</ProductArchitecture>
</InstallationTarget>
</Installation>
<Prerequisites>
<Prerequisite Id="Microsoft.VisualStudio.Component.CoreEditor" Version="[17.0,)" DisplayName="Visual Studio core editor" />
</Prerequisites>
<Assets>
<Asset Type="Microsoft.VisualStudio.VsPackage" d:Source="Project" d:ProjectName="%CurrentProject%" Path="|%CurrentProject%;PkgdefProjectOutputGroup|" />
</Assets>
</PackageManifest>
Использование 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.2092" />
</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
Если вы также хотите внести свой вклад в такие компоненты, как окна инструментов и слушатели редакторов, используя VisualStudio.Extensibility SDK в рамках существующего расширения VSSDK, необходимо выполнить дополнительные шаги, чтобы создать экземпляр VisualStudio.Extensibility Extension в вашем проекте.
Вам нужен стиль пакета SDK
.csproj
для использования пакетов SDK VisualStudio.Extensibility. Для существующих проектов вам может понадобиться обновить.csproj
в стиль SDK.Удалите ссылку на пакет для
Microsoft.VSSDK.BuildTools
и вместо этого добавьте ссылки на пакеты для VisualStudio.Extensibility.
<PackageReference Include="Microsoft.VisualStudio.Extensibility.Sdk" Version="17.9.2092" PrivateAssets="all" />
<PackageReference Include="Microsoft.VisualStudio.Extensibility.Build" Version="17.9.2092" PrivateAssets="all" />
- Добавьте свойство
VssdkCompatibleExtension
в файл проекта, присвойте ему значениеtrue
. Это свойство включает некоторые функции VSSDK для обеспечения совместимости.
<PropertyGroup>
<VssdkCompatibleExtension>true</VssdkCompatibleExtension>
</PropertyGroup>
- Создайте новый класс расширения, наследующий от базового класса
Extension
и задайте свойство RequiresInProcessHosting, как показано ранее. - Измените файл
source.extension.vsixmanifest
, добавивExtensionType="VSSDK+VisualStudio.Extensibility"
в тегInstallation
.
<Installation ExtensionType="VSSDK+VisualStudio.Extensibility">
Теперь вы можете использовать все возможности VisualStudio.Extensibility вместе с существующим расширением VSSDK.