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


Managed Extensibility Framework в редакторе

Редактор создается с помощью компонентов Managed Extensibility Framework (MEF). Вы можете создавать собственные компоненты MEF для расширения редактора, а код также может использовать компоненты редактора.

MEF — это библиотека .NET, которая позволяет добавлять и изменять функции приложения или компонента, который следует модели программирования MEF. Редактор Visual Studio может предоставлять и использовать компоненты КОМПОНЕНТА MEF.

MEF содержится в платформа .NET Framework версии 4 System.ComponentModel.Composition.dll.

Дополнительные сведения о MEF см. в статье Об управляемой платформе расширяемости (MEF).

Компоненты и контейнеры композиции

Компонентная часть — это класс или член класса, который может выполнять одно (или оба) из следующих элементов:

  • Использование другого компонента

  • Использование другим компонентом

    Например, рассмотрим приложение для покупок с компонентом записи заказа, которое зависит от данных о доступности продукта, предоставляемых компонентом инвентаризации склада. В условиях MEF часть инвентаризации может экспортировать данные о доступности продукта, а часть записи заказа может импортировать данные. Часть записи заказа и часть инвентаризации не должны знать друг о другом; Контейнер композиции (предоставленный ведущим приложением) отвечает за обслуживание набора экспортов и разрешение экспорта и импорта.

    Контейнер композиции, как правило, CompositionContainerпринадлежит узлу. Контейнер композиции поддерживает каталог экспортированных частей компонентов.

Экспорт и импорт компонентов

Вы можете экспортировать любую функциональность, если она реализована как открытый класс или общедоступный член класса (свойство или метод). Вам не нужно наследовать часть компонента.ComposablePart Вместо этого необходимо добавить ExportAttribute атрибут в элемент класса или класса, который требуется экспортировать. Этот атрибут указывает контракт , с помощью которого другая часть компонента может импортировать функциональные возможности.

Контракт экспорта

Определяет ExportAttribute сущность (класс, интерфейс или структуру), экспортируемую. Как правило, атрибут экспорта принимает параметр, указывающий тип экспорта.

[Export(typeof(ContentTypeDefinition))]
class TestContentTypeDefinition : ContentTypeDefinition {   }

По умолчанию ExportAttribute атрибут определяет контракт, который является типом класса экспорта.

[Export]
[Name("Structure")]
[Order(After = "Selection", Before = "Text")]
class TestAdornmentLayerDefinition : AdornmentLayerDefinition {   }

В примере атрибут по умолчанию [Export] эквивалентен [Export(typeof(TestAdornmentLayerDefinition))].

Вы также можете экспортировать свойство или метод, как показано в следующем примере.

[Export]
[Name("Scarlet")]
[Order(After = "Selection", Before = "Text")]
public AdornmentLayerDefinition scarletLayerDefinition;

Импорт экспорта MEF

Если вы хотите использовать экспорт MEF, необходимо знать контракт (обычно тип), с помощью которого он был экспортирован, и добавить ImportAttribute атрибут, имеющий это значение. По умолчанию атрибут импорта принимает один параметр, который является типом класса, который он изменяет. Следующие строки кода импортируют IClassificationTypeRegistryService тип.

[Import]
internal IClassificationTypeRegistryService ClassificationRegistry;

Устранение неполадок импорт и экспорт: доступ к журналу ошибок композиции MEF

Если вы попытаетесь импортировать то, что не существует в текущей установке VS, или если вы неправильно создаете импорт или экспорт. Основным способом поиска и устранения этих проблем является ссылка на журнал ошибок композиции Управляемой платформы расширяемости (MEF), хранящийся в папке %localappdata%\Microsoft\VisualStudio[yourVSVersion]\ComponentModelCache\Microsoft.VisualStudio.Default.err.

Получение функциональных возможностей редактора из части компонента MEF

Если существующий код является частью компонента MEF, можно использовать метаданные MEF для использования компонентов редактора.

Использование функций редактора из части компонента MEF

  1. Добавьте ссылки на System.Composition.ComponentModel.dll, который находится в глобальном кэше сборок (GAC) и в сборки редактора.

  2. Добавьте соответствующие директивы using.

    using System.ComponentModel.Composition;
    using Microsoft.VisualStudio.Text;
    
  3. Добавьте атрибут в [Import] интерфейс службы, как показано ниже.

    [Import]
    ITextBufferFactoryService textBufferService;
    
  4. При получении службы можно использовать любой из его компонентов.

  5. Когда вы скомпилировали сборку, поместите ее в *.. Папка \Common7\IDE\Components* установки Visual Studio.