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

Управляемая среда расширяемости (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 состоит из хоста MEF и двух частей. Части реализуют очень простой интерфейс (ICompute) который задает три перегрузки одной функции (compute).

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

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

  • Хост 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. Создайте свой компонент, следование инструкциям в Генерирует блок.NET и Создает Приложение.NET.

  2. Измените настройки проекта ( > 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
  3. Нажмите кнопку Package.

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

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

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

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

    Примечание

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

  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
    

Примечание

Если вы получаете исключение, указывающее, что не пройдено инициализатор типа, гарантируйте, что вам установили права доступа.NET позволять приложениям загружать блоки от сети.