Управляемая среда расширяемости (MEF) является библиотекой для того, чтобы создать легкие, расширяемые приложения.
Для актуальной информации относительно 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
Сократите интерфейсный блок
Метаданные со строгим контролем типов приписывают блок
Запустите 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 |
Создайте свой компонент, следование инструкциям в Генерирует блок.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
Примечание
Если вы получаете исключение, указывающее, что не пройдено инициализатор типа, гарантируйте, что вам установили права доступа.NET позволять приложениям загружать блоки от сети.