Среда управляемой расширяемости (MEF) является библиотекой для создания легких, расширяемых приложений.
При работе с приложениями .NET обычно необходимо указать, какие компоненты .NET следует загрузить.
Быстрое обновление приложения жестко закодированными именами и местоположениями компонентов .NET становится проблемой обслуживания, особенно если обновление должно быть выполнено конечным пользователем, который может не ознакомиться с техническими аспектами приложения.
MEF позволяет вам создать plug-in среду для вашего приложения или использовать существующую среду без необходимой предварительной настройки. Он позволяет избегать жестко закодированных зависимостей и повторно использовать расширения внутри приложений и между ними. Использование MEF позволяет избежать перекомпиляции приложений, таких как Microsoft® Silverlight™, для которого исходный код обычно недоступен.
MEF предоставляет способ автоматического обнаружения компонентов .NET. Это делается при помощи компонентов MEF, называемых parts. Части декларативно задают dependencies (импорт) и capabilities (экспорты) через метаданные.
Приложение MEF состоит из host программы, которая вызывает функции, заданные в частях MEF. MEF Parts, которые реализуют те же экспорты функций интерфейсов с идентичными именами. Все эти части участвуют в общих средах.
Каждая часть реализует интерфейс; часто, многие части реализуют один и тот же интерфейс. Детали, реализующие те же экспорты функций интерфейсов с одинаковыми именами, которые могут использоваться в различных приложениях. Части MEF, которые реализуют тот же интерфейс, должны иметь описательные, уникальные метаданные.
Хост MEF исследует метаданные каждой детали, чтобы определить, какие из них загружать и вызывать.
Детали MEF аналогичны MATLAB® Файлы MEX - каждый файл MEX динамически расширяет MATLAB так же, как части динамически расширяют компоненты .NET.
Актуальные сведения о MEF см. в статье MSDN «Управляемые Среды расширения».
Прежде чем запускать этот пример, имейте в виду следующее:
Необходимо запустить по крайней мере Microsoft Visual Studio® 2010 для создания приложений MEF. Если невозможно использовать Microsoft Visual Studio 2010, невозможно запустить этот пример кода или любую другую программу, использующую MEF. Конечным пользователям не требуется Microsoft Visual Studio 2010 для запуска приложений с использованием MEF.
Для использования функции MEF необходимо использовать по крайней мере Microsoft .NET Framework 4.0.
Если вы хотите использовать MEF, самый легкий способ сделать это - через безопасный для типа API.
Этот пример состоит из хоста MEF и двух частей. Части реализуют очень простой интерфейс (ICompute
), которая определяет три перегрузки одной функции (compute
).
Каждая часть выполняет простую арифметику. В одной части вычислительная функция добавляет единицу (1) к своему входу. В другой части вычисление умножает его вход на два (2). Хост MEF загружает обе части и дважды вызывает их вычислительные функции.
Чтобы запустить этот пример, вы создадите новое решение, содержащее три проекта:
Хост MEF
Сборка интерфейса контракта
Сильно типизированная сборка атрибута метаданных
Для реализации MEF требуется опыт разработчика .NET, поскольку он выполняет ряд сложных задач программирования.
Чтобы развернуть компонент на основе MEF, следуйте этому общему рабочему процессу:
Запустите Microsoft Visual Studio 2010.
Нажмите File > New > Project.
На панели Installed Templates щелкните Visual C#, чтобы фильтровать список доступных шаблонов.
Выберите шаблон Console Application из списка.
В Name поле введите MEFHost
.
Нажмите OK. Ваш проект создан.
Замените содержимое Program.cs
по умолчанию с
MEFHost.cs
код. Для получения информации о поиске кода примера смотрите «Где найти код примера» выше.
На панели Solution Explorer выберите MEFHost проекта и щелкните правой кнопкой мыши. Выберите Add Reference.
Нажмите Assemblies > Framework и добавьте ссылку на System.ComponentModel.Composition
.
Чтобы предотвратить ошибки безопасности, особенно если у вас есть нелокальная установка MATLAB, добавьте файл строения приложения к проекту. Этот XML- файл предписывает узлу MEF доверять сборкам, загружаемым из сети. Если ваш проект не включает этот файл строения, ваше приложение не работает во время выполнения.
Выберите проект MEFHost на панели Solution Explorer и щелкните правой кнопкой мыши.
Нажмите Add > New Item.
Из списка доступных элементов выберите Application Configuration File.
Назовите файл строения App.config
и нажмите Add.
Замените автоматически сгенерированное содержимое App.config
с этим строением:
<?xml version="1.0" encoding="utf-8" ?> <configuration> <runtime> <loadFromRemoteSources enabled="true" /> </runtime> </configuration>
Вы закончили создание первого проекта, который создает хост MEF.
Затем добавляется проект библиотеки классов C # для сборки интерфейса контракта MEF.
в Visual Studio щелкните File > New > Project.
На панели Installed Templates щелкните Visual C#, чтобы фильтровать список доступных шаблонов.
Выберите шаблон Class Library из списка.
В Name поле введите Contract
.
Примечание
Убедитесь, что Add to solution
выбирается в раскрывающемся списке Solution.
Нажмите OK. Ваш проект создан.
Замените содержимое 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
решение.
в Visual Studio щелкните File > New > Project.
На панели Installed Templates щелкните Visual C#, чтобы фильтровать список доступных шаблонов.
Выберите шаблон Class Library из списка.
В Name поле введите Attribute
.
Примечание
Убедитесь, что Add to solution
выбирается в раскрывающемся списке Solution.
Нажмите OK. Ваш проект создан.
В сгенерированном коде сборки смените пространство имен на Attribute
на MEFHost
. Теперь код пространства имен должен выглядеть следующим образом:
В 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 }
Перейдите на вкладку .NET и добавьте ссылку на System.ComponentModel.Composition.dll
.
Перед компиляцией кода в Microsoft Visual Studio:
В проекте MEFHost добавьте ссылки на проекты Contract и Attribute.
В проекте Attribute добавьте ссылку на проект Contract.
Создайте весь код, выбрав имя решения MEFHost на панели Solution Explorer, щелкнув правой кнопкой мыши и выбрав Build Solution.
При этом вы создаете следующие двоичные файлы в MEFHost/bin/Debug
:
Attribute.dll
Contract.dll
MEFHost.exe
Создайте две функции MATLAB. Каждый из них должен иметь имена compute
и хранятся в отдельных папках, в проекте Microsoft Visual Studio:
Создайте файл метаданных для каждой функции MATLAB.
Для MEFHost/Add/compute.m
:
Назовите файл метаданных MEFHost/Add/Add.metadata
.
В этом файле введите следующие метаданные в одну линию:
[MEFHost.ComputationType(FunctionType=MEFHost.Operation.Plus, Operand=1)]
Для MEFHost/Multiply/compute.m
:
Назовите файл метаданных MEFHost/Multiply/Multiply.metadata
.
В этом файле введите следующие метаданные в одну линию:
[MEFHost.ComputationType(FunctionType=MEFHost.Operation.Times, Operand=2)]
На этом шаге используйте приложение 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 |
Щелкните Library Compiler приложение в галерее Apps.
Создайте свой компонент, следуя инструкциям, приведенным в разделе «Сгенерировать сборку .NET и создать приложение .NET».
Измените настройки проекта ( > Settings) на вкладке Type Safe API для любого проекта, который вы строите (Addition
или Multiplication
).
Настройка проекта | Addition.prj | Multiplication.prj |
Включите безопасный API-интерфейс | Проверенный | Проверенный |
Интерфейсная сборка | MEFHost/bin/Debug/Contract.dll | MEFHost/bin/Debug/Contract.dll |
Метаданные MEF | MEFHost/Add/Add.metadata | MEFHost/Multiply/Multiply.metadata |
Сборка атрибутов | MEFHost/bin/Debug/Attribute.dll | MEFHost/bin/Debug/Attribute.dll |
Обернутый класс | Add | Multiply |
Нажмите кнопку «Пакет».
Два компонента, которые вы создали, являются деталями MEF. Теперь необходимо переместить сгенерированные детали в директорию каталога, чтобы приложение могло их найти:
Создайте папку деталей с именем MEFHost/Parts
.
При необходимости измените аргумент путь, который передается в DirectoryCatalog
конструктор в вашей хост-программе MEF. Он должен совпадать с полным путем к Parts
папка, которую вы только что создали.
Примечание
Если вы измените путь после первого создания хоста MEF, необходимо снова перестроить хост MEF, чтобы забрать новую Parts
путь.
Скопируйте два
s (component
Native.dllAddition
и Multiplication
) и AddICompute.dll
и MultiplyICompute.dll
блоки от вашего в MEFHost/Parts
.
Примечание
Вам не нужно ссылаться ни на одну из сборок деталей MEF в основной программе MEF. Хост-программа использует DirectoryCatalog
, что означает, что он автоматически ищет (и загружает) детали, которые он находит в указанной папке. Вы можете добавить части в любое время, не требуя перекомпиляции или повторного подключения приложения хоста MEF. Вам не нужно копировать Addition.dll
или Multiplication.dll
на Parts
директория.
MATLAB-части MEF требуют MATLAB Runtime, как и весь развернутый код MATLAB.
Перед запуском хоста MEF убедитесь, что доступна правильная версия MATLAB Runtime и что
находится на вашем пути.matlabroot
/ runtime/ arch
В командном окне запустите следующее. Этот пример предполагает, что вы бежите от c:\Work
.
c:\Work> MEFHost\bin\Debug\MEFHost.exe
Проверьте, что вы получаете следующие выходы:
8 Plus 1 = 9 9 Times 2 = 18 16 Plus 1 = 17 1.5707963267949 Times 2 = 3.14159265358979
Поиск и устранение проблем с хост-программой MEF
Вы получаете исключение, указывающее на ошибку инициализатора типа?
Вы получаете исключение, указывающее, что MWArray.dll
не может быть загружен обычно?
Вы получаете исключение для конкретной версии mclmcrrt
не удается загрузить?