Поделиться через


Компоненты расширения 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.