Компоненты расширения VisualStudio.Extensibility
Расширение, использующее VisualStudio.Extensibility, обычно содержит несколько компонентов, взаимодействующих вместе, а также с Visual Studio.
Экземпляр расширения
Расширения должны иметь класс, производный от Extension
. Пример реализации см. в разделе MarkdownLinter.
Экземпляр Extension
класса является отправной точкой для выполнения расширения. Этот экземпляр содержит необходимые методы для Visual Studio для запроса служб, предоставляемых расширением. Он также предоставляет виртуальные методы для расширения для предоставления локализованных ресурсов и локальных служб, принадлежащих расширению, для совместного использования между компонентами расширения.
Конфигурация класса также содержит метаданные для расширения, которое отображается в окне "Управление расширениями Visual Studio" и для опубликованных расширений в Visual Studio Marketplace.Extension
[VisualStudioContribution]
public class MarkdownLinterExtension : Extension
{
/// <inheritdoc/>
public override ExtensionConfiguration ExtensionConfiguration => new()
{
Metadata = new(
id: "MarkdownLinter.0cf26ba2-edd5-4419-8646-a55d0a83f7d8",
version: this.ExtensionAssemblyVersion,
publisherName: "Microsoft",
displayName: "Markdown Linter Sample Extension",
description: "Sample markdown linter extension"),
};
...
Для разработчиков расширений, знакомых с существующими API VSSDK, Metadata
они ExtensionConfiguration
используются для создания .vsixmanifest
файла. Кроме того, Extension
класс аналогичен AsyncPackage
классу, который используется в модели расширяемости VSSDK.
Объект VisualStudioExtensibility
Объект VisualStudioExtensibility
выступает в качестве точки входа для функций расширяемости, предоставляемых Visual Studio. Этот класс имеет различные методы расширения, свойства для быстрого перечисления с помощью доступных функций в пакете SDK расширяемости. См. документацию по API для доступных методов.
Части расширения
Для функций, в которых расширение вносит вклад компонентов в Visual Studio, таких как команды, прослушиватели редактора, расширения будут использовать классы атрибутов. Процесс сборки создаст правильные метаданные, чтобы убедиться, что эти компоненты могут быть обнаружены Visual Studio.
Для функций, в которых расширение вносит вклад компонентов в Visual Studio, таких как команды, прослушиватели редакторов, окна инструментов и т. д., расширения используют классы, помеченные атрибутом VisualStudioContribution
. Процесс сборки создает правильные метаданные, чтобы убедиться, что эти компоненты могут быть обнаружены Visual Studio.
В настоящее время пакет SDK поддерживает ограниченный набор компонентов, которые необходимо ввести:
- Обработчики команд
- Окна инструментов
- Текстовое представление открыло закрытые прослушиватели для отслеживания созданных, закрытых событий.
- Прослушиватели изменений в представлении текста для отслеживания изменений в открытом текстовом представлении.
- Поставщики полей
- Визуализаторы отладчика
Экземпляры этих классов создаются как часть платформы расширяемости, предоставляемой пакетом SDK с помощью библиотеки внедрения зависимостей, и конструкторы можно использовать для получения экземпляров служб, предоставляемых пакетом SDK или самим расширением для совместного использования состояния между компонентами.
Время существования частей расширения
Время существования каждой части управляется соответствующим компонентом, который загружает эти части внутри процесса интегрированной среды разработки Visual Studio.
Обработчики команд инициализированы при активации соответствующего набора команд, который может быть во время первого выполнения команды. После активации обработчики команд должны быть удалены только при завершении работы интегрированной среды разработки.
Аналогично прослушиватели событий представления текста инициализированы при загрузке первого текстового представления, соответствующего указанному типу контента, в интегрированной среде разработки. В настоящее время такие прослушиватели активны до завершения работы интегрированной среды разработки, но это поведение может измениться в будущем.
Как правило, для сложных расширений мы рекомендуем предоставлять локальные службы, которые части могут импортировать в конструкторе и использовать эти службы для совместного использования состояния между частями и между экземплярами одной части. Эта практика гарантирует, что состояние расширения не влияет на изменения времени существования частей расширения.
Службы, предоставляемые пакетом SDK для внедрения
Следующие службы предоставляются пакетом SDK, который можно использовать в конструкторе для любой части расширения:
VisualStudioExtensibility
: каждая часть расширения может внедрить экземпляр для взаимодействия с интегрированной среды разработкиVisualStudioExtensibility
Visual Studio.Extension
: части могут внедрятьMicrosoft.VisualStudio.Extensibility.Extension
тип или расширения собственный тип, наследующий от него в части расширения.TraceSource
: экземпляр источника трассировки создается по запросу для каждого расширения, которое можно использовать для записи диагностических сведений. Эти экземпляры зарегистрированы в поставщике диагностика Visual Studio, который можно использовать для слияния журналов из нескольких служб и использования будущих инструментов для доступа к журналу в режиме реального времени. См . ведение журнала.Локальные службы: любые локальные службы, предоставляемые самим расширением, также будут доступны для внедрения зависимостей.
MefInjection<TService>
иAsyncServiceProviderInjection<TService, TInterface>
: расширения in-proc могут внедрять службы SDK Visual Studio, которые традиционно используются через MEF или AsyncServiceProvider.
Локальные службы расширений
В некоторых сценариях расширение может потребоваться предоставить общий доступ к состоянию между различными компонентами, например обработчиком команд и прослушивателем изменений в представлении текста, как показано в MarkdownLinter
примере. Эти службы можно добавить в коллекцию служб в процессе путем переопределения Extension.InitializeServices
метода и создания экземпляров частей расширения, службы внедряются на основе аргументов конструктора.
Существует три варианта добавления службы:
AddTransient
: для каждой части, которая получает ее, создается новый экземпляр службы.AddScoped
: новый экземпляр службы создается в определенной области. В контексте расширяемости Visual Studio область относится к одной части расширения.AddSingleton
: существует один общий экземпляр службы, созданный при первом приеме.
Из-за времени существования объекта, привязанного VisualStudioExtensibility
к области одной части расширения, любая локальная служба, которая получает ее, должна быть временной или временной службой. Попытка создать единую службу, которая внедряет VisualStudioExtensibility
, приведет к сбою.
Пример использования локальных служб см. в разделе "Расширение MarkdownLinter".
Контекст клиента
Так как все расширения в новом пакете SDK не выполняются, мы представляем концепцию контекста клиента для различных частей расширения для представления состояния интегрированной среды разработки во время вызова события или метода. Этот контекст представлен экземпляром IClientContext
пакета SDK и передается в различные операции, такие как обработчики выполнения команд. Пакет SDK предоставляет методы IClientContext
расширения, которые можно использовать для извлечения объектов из контекста. Например, расширения могут получить активное текстовое представление или универсальный код ресурса (URI) для выбранных элементов во время выполнения команды, использующим IClientContext
экземпляр.
Некоторые компоненты, такие как команды, также позволяют объявлять, какие контексты они интересуют. Это делается для оптимизации объема данных, передаваемых в каждом удаленном выполнении, так как контекст клиента может получить большой в будущем. В начальной предварительной версии есть только два доступных контекста, Shell
и Editor
оба включены по умолчанию при объявлении команды с помощью CommandAttribute
.