Создайте плагины Управляемой среды расширяемости (MEF)

Что такое MEF?

Управляемая среда расширяемости (MEF) является библиотекой для того, чтобы создать легкие, расширяемые приложения.

Почему использование MEF?

При работе с приложениями.NET обычно необходимо задать, какие компоненты.NET должны загрузиться.

Держание в курсе приложения с трудно закодированными названиями и местоположением компонентов.NET быстро становится проблемой обслуживания, особенно если обновление должно быть сделано конечным пользователем, который не может быть знаком с техническими аспектами приложения.

MEF позволяет вам создавать среду plug-in для своего приложения или использовать существующую среду без необходимого предварительного конфигурирования. Это позволяет вам избежать трудно закодированных зависимостей и расширений повторного использования в и через приложения. Используя MEF позволяет вам постараться не перекомпилировать приложения, такие как Microsoft® Silverlight™, которому исходный код обычно недоступен.

Как делает работу MEF?

MEF обеспечивает путь к компонентам.NET, которые будут автоматически обнаружены. Это делает это при помощи компонентов MEF под названием parts. Части декларативно задают dependencies (импорт) и capabilities (экспорт) через метаданные.

Приложение MEF состоит из программы host, которая вызывает функции, определяемые в частях MEF. Части MEF, которые реализуют те же интерфейсные экспорты функций с идентичными именами. Эти части все участвуют в общих основах.

Каждая часть реализует интерфейс; часто времена, много частей реализуют тот же интерфейс. Части, которые реализуют те же интерфейсные экспорты функций с идентичными именами, которые могут использоваться по множеству приложений. Части MEF, которые реализуют тот же интерфейс, должны иметь описательные, уникальные метаданные.

Хост MEF исследует метаданные каждой части, чтобы определить, чтобы загрузить и вызвать.

Части MEF подобны файлам MEX MATLAB® — каждый файл MEX динамически расширяет MATLAB, как части динамически расширяют компоненты.NET.

Для получения дополнительной информации О MEF

Для актуальной информации относительно MEF отошлите к статье MSDN “Управляемую Среду Расширяемости”.

Предпосылки MEF

Прежде, чем запустить этот пример, помните о следующем:

  • Необходимо запускать, по крайней мере, Microsoft Visual Studio® 2010, чтобы создать приложения MEF. Если вы не можете использовать Microsoft Visual Studio 2010, вы не можете запустить этот пример кода или любую другую программу, которая использует MEF. Конечным пользователям не нужен Microsoft Visual Studio 2010, чтобы запустить приложения с помощью MEF.

  • Необходимо запускать, по крайней мере, Microsoft.NET Framework 4.0, чтобы использовать функцию MEF.

  • Если вы хотите использовать MEF, самый легкий способ сделать так через безопасный с точки зрения типов API.

Сложение и приложения умножения с MEF

Этот пример приложения MEF состоит из хоста MEF и двух частей. Части реализуют очень простой интерфейс (ICompute), который задает три перегрузки одной функции (compute).

Каждая часть выполняет простую арифметику. В одной части вычислить функция добавляет один (1) к своему входу. В другой части вычислите, умножает ее вход на два (2). Хост MEF загружает и части и вызывает их вычислять функции дважды.

Чтобы запустить этот пример, вы создадите новое решение, содержащее три проекта:

  • Хост MEF

  • Сократите интерфейсный блок

  • Метаданные со строгим контролем типов приписывают блок

MEF реализации требует экспертных знаний Разработчика.NET, потому что это требует выполнения многих усовершенствованных задач программирования.

 Где найти пример кода для MEF

Чтобы развернуть основанный на MEF компонент, следуйте за этим общим рабочим процессом:

Создайте блок MEFHost

  1. Запустите Microsoft Visual Studio 2010.

  2. Нажмите File > New > Project.

  3. В панели Installed Templates нажмите Visual C#, чтобы отфильтровать список доступных шаблонов.

  4. Выберите шаблон Console Application из списка.

  5. В поле Name введите MEFHost.

  6. Нажмите OK. Ваш проект создается.

  7. Замените содержимое Program.cs по умолчанию с кодом MEFHost.cs. Для получения информации о располагающемся примере кода см., “Где Найти Пример кода”, выше.

  8. В панели Solution Explorer выберите проект MEFHost и щелкните правой кнопкой. Выберите Add Reference.

  9. Нажмите Assemblies > Framework и добавьте ссылку на System.ComponentModel.Composition.

  10. Чтобы предотвратить ошибки безопасности, особенно если у вас есть нелокальная установка MATLAB, добавляет, файл конфигурации приложения к проекту. Этот XML-файл дает хосту MEF команду доверять блокам, загруженным от сети. Если ваш проект не включает этот конфигурационный файл, ваши сбои приложения во время выполнения.

    1. Выберите проект MEFHost в Solution Explorer, разделяют на области и щелкают правой кнопкой.

    2. Нажмите Add > New Item.

    3. Из списка доступных элементов выберите Application Configuration File.

    4. Назовите конфигурационный файл App.config и нажмите Add.

    5. Замените автоматически сгенерированное содержимое App.config с этой настройкой:

      <?xml version="1.0" encoding="utf-8" ?>
      <configuration>
          <runtime>
            <loadFromRemoteSources enabled="true" />
          </runtime>
        </configuration>
      

Вы закончили разрабатывать первый проект, который создает хост MEF.

Затем, вы добавляете проект библиотеки классов C# для блока интерфейса контракта MEF.

Создайте блок интерфейса контракта

  1. в Visual Studio нажмите File > New > Project.

  2. В панели Installed Templates нажмите Visual C#, чтобы отфильтровать список доступных шаблонов.

  3. Выберите шаблон Class Library из списка.

  4. В поле Name введите Contract.

    Примечание

    Гарантируйте, что Add to solution выбран в Solution выпадающее поле.

  5. Нажмите OK. Ваш проект создается.

  6. Замените содержимое Class1.cs по умолчанию со следующим кодом интерфейса ICompute:

    namespace Contract
    {
    		public interface ICompute
    		{
        	double compute(double y);
       		double[] compute(double[] y);
       		double[,] compute(double[,] y);
    		}
    	}

Вы закончили разрабатывать второй проект, который создает блок Интерфейса Контракта.

Поскольку метаданные со строгим контролем типов требуют, чтобы вы украсили MEF, расстается с пользовательским атрибутом метаданных, на следующем шаге, вы добавляете проект библиотеки классов C#. Этот проект создает блок атрибута к вашему решению MEFHost.

Создайте блок атрибута метаданных

  1. в Visual Studio нажмите File > New > Project.

  2. В панели Installed Templates нажмите Visual C#, чтобы отфильтровать список доступных шаблонов.

  3. Выберите шаблон Class Library из списка.

  4. В поле Name введите Attribute.

    Примечание

    Гарантируйте, что Add to solution выбран в Solution выпадающее поле.

  5. Нажмите OK. Ваш проект создается.

  6. В сгенерированном ассемблерном коде измените пространство имен от Attribute до MEFHost. Ваш код пространства имен должен теперь быть похожим на следующее:

  7. В пространстве имен MEFHost замените содержимое класса по умолчанию Class1.cs со следующим кодом для класса ComputationTypeAttribute:

    using System.ComponentModel.Composition;
    [MetadataAttribute]
    [AttributeUsage(AttributeTargets.Class, AllowMultiple=false)]
    public class ComputationTypeAttribute: ExportAttribute
    {
        public ComputationTypeAttribute() : 
                base(typeof(Contract.ICompute)) { }
        public Operation FunctionType{ get; set; }
        public double Operand { get; set; }
    }
    
    public enum Operation
    {
        Plus,
        Times
    }
    

  8. Перейдите к вкладке .NET и добавьте ссылку на System.ComponentModel.Composition.dll.

Добавьте контракт, и приписывает ссылки на MEFHost

Прежде, чем скомпилировать ваш код в Microsoft Visual Studio:

  1. В вашем проекте MEFHost добавьте ссылки на проекты Attribute и Contract.

  2. В вашем проекте Attribute добавьте ссылку на проект Contract.

Скомпилируйте свой код в Microsoft Visual Studio

Создайте весь свой код путем выбора названия решения MEFHost в панели Solution Explorer, щелчке правой кнопкой и выборе Build Solution.

При этом вы создаете следующие двоичные файлы в MEFHost/bin/Debug:

  • Attribute.dll

  • Contract.dll

  • MEFHost.exe

Запишите функции MATLAB для частей MEF

Создайте две функции MATLAB. Каждого нужно назвать compute и сохранить в отдельных папках, в рамках вашего проекта Microsoft Visual Studio:

 MEFHost/Multiply/compute.m

 MEFHost/Add/compute.m

Создайте файлы метаданных

Создайте файл метаданных для каждой функции MATLAB.

  1. Для MEFHost/Add/compute.m:

    1. Назовите файл метаданных MEFHost/Add/Add.metadata.

    2. В этом файле введите следующие метаданные по одной строке:

      [MEFHost.ComputationType(FunctionType=MEFHost.Operation.Plus, Operand=1)] 
      
  2. Для MEFHost/Multiply/compute.m:

    1. Назовите файл метаданных MEFHost/Multiply/Multiply.metadata.

    2. В этом файле введите следующие метаданные по одной строке:

      [MEFHost.ComputationType(FunctionType=MEFHost.Operation.Times, Operand=2)]
      

Создайте компоненты.NET из функций MATLAB и метаданных

На этом шаге используйте приложение Library Compiler, чтобы создать компоненты.NET из функций MATLAB и сопоставленных метаданных.

Используйте информацию в этих таблицах, чтобы создать и Addition и проекты Multiplication.

Примечание

Поскольку вы развертываете две функции, необходимо запустить приложение Library Compiler дважды, однажды использование информации о Addition.prj и однажды использование следующей информации о Multiplication.prj.

Addition.prj

Название проектаAddition
ClassName Add
Файл, чтобы скомпилироватьMEFHost/Add/compute.m

Multiplication.prj

Название проектаMultiplication
ClassName Multiply
Файл, чтобы скомпилироватьMEFHost/Multiply/compute.m
  1. Кликните по приложению Library Compiler в галерее приложений.

  2. Создайте свой компонент, следование инструкциям в Генерирует блок.NET и Создает Приложение.NET.

  3. Измените настройки проекта ( > Settings) на вкладке Type Safe API для любого проекта, который вы разрабатываете (Addition или Multiplication).

    Установка проектаAddition.prjMultiplication.prj
    Включите безопасный с точки зрения типов API ПроверенныйПроверенный
    Интерфейсный блокMEFHost/bin/Debug/Contract.dll MEFHost/bin/Debug/Contract.dll
    Метаданные MEFMEFHost/Add/Add.metadata MEFHost/Multiply/Multiply.metadata
    Припишите блокMEFHost/bin/Debug/Attribute.dll MEFHost/bin/Debug/Attribute.dll
    Перенесенный классAddMultiply
  4. Нажмите кнопку Package.

Установите части MEF

Эти два компонента, которые вы создали, являются частями MEF. Теперь необходимо переместить сгенерированные части в директорию каталога, таким образом, приложение может найти их:

  1. Создайте папку частей под названием MEFHost/Parts.

  2. При необходимости измените параметр пути, который передается конструктору DirectoryCatalog в вашей хост-программе MEF. Это должно совпадать с полным путем к папке Parts, которую вы только создали.

    Примечание

    Если вы изменяете путь после создания хоста MEF в первый раз, когда необходимо восстановить хост MEF снова, чтобы взять новый путь Parts.

  3. Скопируйте два componentNative.dll s (Addition и Multiplication) и AddICompute.dll и блоки MultiplyICompute.dll от вашего в MEFHost/Parts.

    Примечание

    Вы не должны ссылаться ни на один из своих блоков части MEF в хост-программе MEF. Хост-программа использует DirectoryCatalog, что означает, что она автоматически ищет (и загрузки) части, которые она находит в заданной папке. Можно добавить части в любое время, не имея необходимость перекомпилировать или повторно соединить хост-приложение MEF. Вы не должны копировать Addition.dll или Multiplication.dll к директории Parts.

Запустите хост-программу MEF

Основанные на MATLAB части MEF требуют, чтобы MATLAB Runtime, как все развернул код MATLAB.

Прежде чем вы запустите свой хост MEF, гарантируете, что правильная версия MATLAB Runtime доступна и что matlabroot/runtime/arch находится на вашем пути.

  1. Из командного окна запустите следующее. Этот пример принимает, что вы запускаетесь от c:\Work.

    c:\Work> MEFHost\bin\Debug\MEFHost.exe
    

  2. Проверьте, что вы получаете следующий вывод:

    8 Plus 1 = 9
    9 Times 2 = 18
    16 Plus 1 = 17
    1.5707963267949 Times 2 = 3.14159265358979
    

Поиск и устранение проблем хост-программа MEF

 Вы получаете исключение, указывающее, что инициализатор типа перестал работать?

 Вы получаете исключение, указывающее, что MWArray.dll не может обычно загружаться?

 Вы получаете исключение, которое не может загрузить конкретная версия mclmcrrt?