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


Компоненты расширения Visual Studio Extensibility

Расширение, использующее VisualStudio.Extensibility, обычно содержит несколько компонентов, взаимодействующих вместе, а также с Visual Studio.

Экземпляр расширения

Расширения должны иметь класс, производный от Extension. Пример реализации см. в MarkdownLinter.

Экземпляр класса Extension является отправной точкой для выполнения расширения. Этот экземпляр содержит необходимые методы для Visual Studio для запроса служб, предоставляемых расширением. Он также предоставляет виртуальные методы, позволяющие экстеншену предоставлять локализованные ресурсы и локальные службы экстеншена для совместного использования между его компонентами.

Конфигурация для класса Extension также содержит метаданные для расширения, которое отображается в окне 'Управление расширениями' Visual Studio , а для опубликованных расширений — в Visual Studio Marketplace.

[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 для VisualStudio.Extensibility использует внедрение зависимостей для обеспечения компонентов как встроенными службами, так и службами, предоставляемыми расширением для совместного использования между различными компонентами. Обратитесь к разделу внедрение зависимостей для получения более подробной информации о службах, предлагаемых SDK, длительности службы и примерах использования внедрения зависимостей.

Пример использования локальных служб см. в разделе расширения MarkdownLinter.

Контекст клиента

Поскольку все расширения в новом наборе SDK выполняются вне основного процесса, мы вводим концепцию клиентского контекста для различных частей расширения, чтобы представлять состояние интегрированной среды разработки на момент вызова события или метода. Этот контекст представлен экземпляром IClientContext в пакете SDK и передается в различные операции, такие как обработчики выполнения команд. Пакет SDK предоставляет методы расширения для IClientContext, которые можно использовать для получения объектов из контекста. Например, расширения могут получить активное текстовое представление или URI для выбранных элементов во время выполнения команды, используя экземпляр IClientContext.

Некоторые компоненты, такие как команды, также позволяют объявлять, какие контексты их интересуют. Для оптимизации объема данных, передаваемых во время каждого удаленного выполнения, поскольку контекст клиента может увеличиться в будущем. В начальной предварительной версии доступны только два доступных контекста, Shell и Editor, и оба включены по умолчанию при объявлении команды с помощью CommandAttribute.