Управляемая среда расширяемости (MEF) является библиотекой для того, чтобы создать легкие, расширяемые приложения.
При работе с приложениями.NET обычно необходимо задать, какие компоненты.NET должны загрузиться.
Держание в курсе приложения с трудно закодированными названиями и местоположением компонентов.NET быстро становится проблемой обслуживания, особенно если обновление должно быть сделано конечным пользователем, который не может быть знаком с техническими аспектами приложения.
MEF позволяет вам создавать среду plug-in для своего приложения или использовать существующую среду без необходимого предварительного конфигурирования. Это позволяет вам избежать трудно закодированных зависимостей и расширений повторного использования в и через приложения. Используя MEF позволяет вам постараться не перекомпилировать приложения, такие как Microsoft® Silverlight™, которому исходный код обычно недоступен.
MEF обеспечивает путь к компонентам.NET, которые будут автоматически обнаружены. Это делает это при помощи компонентов MEF под названием parts. Части декларативно задают dependencies (импорт) и capabilities (экспорт) через метаданные.
Приложение MEF состоит из программы host, которая вызывает функции, определяемые в частях MEF. Части MEF, которые реализуют те же интерфейсные экспорты функций с идентичными именами. Эти части все участвуют в общих основах.
Каждая часть реализует интерфейс; часто времена, много частей реализуют тот же интерфейс. Части, которые реализуют те же интерфейсные экспорты функций с идентичными именами, которые могут использоваться по множеству приложений. Части MEF, которые реализуют тот же интерфейс, должны иметь описательные, уникальные метаданные.
Хост MEF исследует метаданные каждой части, чтобы определить, чтобы загрузить и вызвать.
Части MEF похожи на файлы MEX MATLAB® — каждый файл MEX динамически расширяет MATLAB, как части динамически расширяют компоненты.NET.
Для актуальной информации относительно MEF отошлите к статье MSDN “Управляемую Среду Расширяемости”.
Прежде, чем запустить этот пример, помните о следующем:
Необходимо запускать, по крайней мере, 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 и двух частей. Части реализуют очень простой интерфейс (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); } }
Вы закончили разрабатывать второй проект, который создает блок Интерфейса Контракта.
Поскольку метаданные со строгим контролем типов требуют, чтобы вы украсили 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 добавьте ссылки на проекты Attribute и Contract.
В вашем проекте 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 |
ClassName | Add |
Файл, чтобы скомпилировать | MEFHost/Add/compute.m |
Multiplication.prj
Название проекта | Multiplication |
ClassName | 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 |
Нажмите кнопку Package.
Эти два компонента, которые вы создали, являются частями MEF. Теперь необходимо переместить сгенерированные части в директорию каталога, таким образом, приложение может найти их:
Создайте папку частей под названием MEFHost/Parts
.
При необходимости измените параметр пути, который передается DirectoryCatalog
конструктор в вашей хост-программе MEF. Это должно совпадать с полным путем к Parts
папка, которую вы только создали.
Если вы изменяете путь после создания хоста MEF в первый раз, когда необходимо восстановить хост MEF снова, чтобы взять новый Parts
path.
Скопируйте два
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
не может загрузить?