Создайте подключаемые модули управляемой среды расширения (MEF)

Что такое MEF?

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

Зачем использовать MEF?

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

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

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

Как MEF Работы?

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

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

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

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

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

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

Актуальные сведения о MEF см. в статье MSDN «Управляемые Среды расширения».

Необходимые условия MEF

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

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

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

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

Приложения сложения и умножения с 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);
    		}
    	}

Завершено построение второго проекта, который создает сборку Contract Interface Assembly.

Поскольку сильно типизированные метаданные требуют, чтобы детали 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 добавьте ссылки на проекты Contract и Attribute.

  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
Имя классаAdd
Файл для компиляцииMEFHost/Add/compute.m

Multiplication.prj

Имя проектаMultiplication
Имя классаMultiply
Файл для компиляцииMEFHost/Multiply/compute.m
  1. Щелкните Library Compiler приложение в галерее Apps.

  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. Нажмите кнопку «Пакет».

Установка деталей MEF

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

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

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

    Примечание

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

  3. Скопируйте два componentNative.dlls (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 не удается загрузить?

Для просмотра документации необходимо авторизоваться на сайте