创建托管扩展框架插件
托管扩展框架 (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 主机
契约接口组装
强类型元数据属性程序集
创建 MEFHost 程序集
启动 Microsoft Visual Studio 2010。
点击 File > New > Project。
在 Installed Templates 窗格中,点击 Visual C# 以过滤可用模板列表。
从列表中选择 Console Application 模板。
在 Name 字段中,输入
MEFHost
。点击确定。您的工程已创建。
用
Program.cs
代码替换默认MEFHost.cs
的内容。有关查找示例代码的信息,请参阅上面的“示例代码的查找位置”。在 Solution Explorer 窗格中,选择工程 MEFHost 并右键点击。选择 Add Reference。
点击 Assemblies > Framework 并添加对
System.ComponentModel.Composition
的引用。为了防止安全错误,特别是在非本地安装 MATLAB® 的情况下,请向工程中添加应用程序配置文件。该 XML 文件指示 MEF 主机信任从网络加载的程序集。如果您的工程不包含此配置文件,您的应用程序将在运行时失败。
在 Solution Explorer 窗格中选择 MEFHost 工程并右键点击。
点击 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 主机。
接下来,为 MEF 协定接口程序集添加一个 C# 类库工程。
创建契约接口程序集
在 Visual Studio 中,点击 File > New > Project。
在 Installed Templates 窗格中,点击 Visual C# 以过滤可用模板列表。
从列表中选择 Class Library 模板。
在 Name 字段中,输入
Contract
。注意
确保在 Solution 下拉框中选择了 Add to solution。
点击确定。您的工程已创建。
将默认
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
。注意
确保在 Solution 下拉框中选择了 Add to solution。
点击确定。您的工程已创建。
在生成的汇编代码中,将命名空间从
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
的引用。
向 MEFHost 添加契约和属性引用
在 Microsoft Visual Studio 中编译代码之前:
在您的 MEFHost 工程中,添加对 Contract 和 Attribute 工程的引用。
在您的 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 工程内的单独文件夹中:
创建元数据文件
为每个 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)]
使用 MATLAB 函数和元数据构建 .NET 组件
在此步骤中,使用 .NET 程序集编译器从 MATLAB 函数和相关元数据创建 .NET 组件。
使用这些表中的信息来创建 Addition
和 Multiplication
工程。
注意
由于您正在部署两个函数,因此需要运行 .NET 程序集编译器 两次,第一次使用 Addition
信息,第二次使用 Multiplication
信息。
Addition 工程
库名称 | Addition |
类名 | Add |
要编译的文件 | MEFHost/Add/compute.m |
Multiplication 工程
库名称 | Multiplication |
类名 | Multiply |
要编译的文件 | MEFHost/Multiply/compute.m |
按照生成 .NET 程序集并编译 .NET 应用程序中的说明创建组件。
对于您正在构建的任何工程(
Addition
或Multiplication
),请在类型安全的 API 选项卡上修改工程设置(> 设置)。
工程设置 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 部件
您构建的两个组件是 MEF 部件。现在您需要将生成的部分移动到目录目录中,以便您的应用程序可以找到它们:
创建名为
MEFHost/Parts
的部件文件夹。如果有必要,请修改传递给 MEF 主机程序中的
DirectoryCatalog
构造函数的路径参量。它必须与您刚刚创建的Parts
文件夹的完整路径相匹配。注意
如果在第一次构建 MEF 主机后更改路径,则必须再次重建 MEF 主机以获取新的
Parts
路径。将两个
(component
Native.dllAddition
和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
从命令行窗口运行以下命令。此示例假设您从
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 安全权限以允许应用程序从网络加载程序集。