主要内容

本页采用了机器翻译。点击此处可查看最新英文版本。

创建托管扩展框架插件

托管扩展框架 (MEF) 是一个用于创建轻量级、可扩展应用程序的库。

有关 MEF 的最新信息,请参阅 MSDN 文章“ Managed Extensibility Framework ”。

前提条件

运行此示例之前,请记住以下几点:

  • 您必须至少运行 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. 点击确定。您的工程已创建。

  7. Program.cs 代码替换默认 MEFHost.cs 的内容。有关查找示例代码的信息,请参阅上面的“示例代码的查找位置”。

  8. Solution Explorer 窗格中,选择工程 MEFHost 并右键点击。选择 Add Reference

  9. 点击 Assemblies > Framework 并添加对 System.ComponentModel.Composition 的引用。

  10. 为了防止安全错误,特别是在非本地安装 MATLAB® 的情况下,请向工程中添加应用程序配置文件。该 XML 文件指示 MEF 主机信任从网络加载的程序集。如果您的工程不包含此配置文件,您的应用程序将在运行时失败。

    1. Solution Explorer 窗格中选择 MEFHost 工程并右键点击。

    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 主机。

接下来,为 MEF 协定接口程序集添加一个 C# 类库工程。

创建契约接口程序集

  1. 在 Visual Studio 中,点击 File > New > Project

  2. Installed Templates 窗格中,点击 Visual C# 以过滤可用模板列表。

  3. 从列表中选择 Class Library 模板。

  4. Name 字段中,输入 Contract

    注意

    确保在 Solution 下拉框中选择了 Add to solution

  5. 点击确定。您的工程已创建。

  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

    注意

    确保在 Solution 下拉框中选择了 Add to solution

  5. 点击确定。您的工程已创建。

  6. 在生成的汇编代码中,将命名空间从 Attribute 更改为 MEFHost。您的命名空间代码现在应如下所示:

    Namespace MEFHost { public class Class1 { } }

  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 工程中,添加对 ContractAttribute 工程的引用。

  2. 在您的 Attribute 工程中,添加对 Contract 工程的引用。

Microsoft Visual Studio 中编译代码

通过在 Solution Explorer 窗格中选择解决方案名称 MEFHost,右键点击并选择 Build Solution 来构建所有代码。

在此过程中,您将在 MEFHost/bin/Debug 中创建以下二进制文件:

  • Attribute.dll

  • Contract.dll

  • MEFHost.exe

为 MEF 部件编写 MATLAB 函数

创建两个 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)]
      

使用 MATLAB 函数和元数据构建 .NET 组件

在此步骤中,使用 .NET 程序集编译器从 MATLAB 函数和相关元数据创建 .NET 组件。

使用这些表中的信息来创建 AdditionMultiplication 工程。

注意

由于您正在部署两个函数,因此需要运行 .NET 程序集编译器 两次,第一次使用 Addition 信息,第二次使用 Multiplication 信息。

Addition 工程

库名称Addition
类名Add
要编译的文件MEFHost/Add/compute.m

Multiplication 工程

库名称Multiplication
类名Multiply
要编译的文件MEFHost/Multiply/compute.m
  1. 按照生成 .NET 程序集并编译 .NET 应用程序中的说明创建组件。

  2. 对于您正在构建的任何工程(AdditionMultiplication),请在类型安全的 API 选项卡上修改工程设置(Settings icon> 设置)。

    工程设置Addition.prjMultiplication.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
    包装的类AddMultiply
  3. 点击“打包”按钮。

安装 MEF 部件

您构建的两个组件是 MEF 部件。现在您需要将生成的部分移动到目录目录中,以便您的应用程序可以找到它们:

  1. 创建名为 MEFHost/Parts 的部件文件夹。

  2. 如果有必要,请修改传递给 MEF 主机程序中的 DirectoryCatalog 构造函数的路径参量。它必须与您刚刚创建的 Parts 文件夹的完整路径相匹配。

    注意

    如果在第一次构建 MEF 主机后更改路径,则必须再次重建 MEF 主机以获取新的 Parts 路径。

  3. 将两个 componentNative.dllAdditionMultiplication)以及 AddICompute.dllMultiplyICompute.dll 程序集从 MEFHost/Parts 复制到。

    注意

    您不需要在 MEF 主机程序中引用任何 MEF 部件程序集。主机程序使用 DirectoryCatalog,这意味着它会自动搜索(并加载)在指定文件夹中找到的部分。您可以随时添加部件,而无需重新编译或重新链接 MEF 主机应用程序。您不需要将 Addition.dllMultiplication.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 安全权限以允许应用程序从网络加载程序集。