For example, you may have a few large data objects (images, for example) that would incur excess cost to your organization if managed
with a type-safe interface. By mixing type-safe interfaces and manual marshaling, smaller data types can be managed
automatically with the type-safe interface and your large data can be managed on an as-needed basis.
回到目录
3.Type-Safe Interfaces实际案例
对这个混编方式,很显示可以节省很多事情,我认为,作为原始的数据类型转换方式,还是应该掌握的。在掌握了之后,再使用这个方法,会事半功倍,毕竟不是所有的问题都可以用接口解决。接下来,就让我们一起用一个小的编程实例,来演示整个过程的使用。 演示环境:Visual Studio 2010,Matlab 2012a,.NET 4.0 演示内容:一个简单的乘法运算混编实现
一、新建一个 类库类型的项目 ,名称MatlabDemo,.NET 4.0,如下图所示:
一、在上面的项目中添加一个接口文件IMultiply.cs,并编写下面的代码,因为我们实现的是一个简单的乘法,所以添加如下几个接口方法:
1namespace MatlabDemo 2 {
3///
6//2个数直接相乘
7double multiply(double x, double y); 8
9//数组相乘
10double[] multiply(double[] x, double y); 11
12//矩阵相乘
13double[,] multiply(double[,] x, double[,] y); 14 }
15 }
这里注意,一定要将接口的可访问性设置为Public,否则混编的时候,Matlab会找不到接口原型,编译失败。编写好,编译项目即可,会在bin文件夹下得到MatlabDemo.dll文件,这个文件下面的步骤会用到。
三、编写M函数,并设置混编项目。我们编写一个简单的乘法M函数m,如下所示:
1 function z = multiply(x, y) 2
3 z = x * y;
注意这里的名称一定要和接口方法的名称对于起来,否则Matlab怎么会认识,想想就明白了。然后在Matlab中输入deploytool命令,输入项目名称:TypeSaftDemo,并选择项目类型:.NET Assembly,这个过程是“混编三部曲”基本过程,以前的视频中专门见到了,不仔细说明,如下图所示:
确定之后,混编项目基本就建立了,然后新建一个类DemoTest,并把上面编写的multiply.m函数添加到这个类中去,这其实就是一个常规的混编过程,很简单。添加完成
之后,如果是普通的混编方式,直接编译就可以了,但基于接口的混编方式,还有一个过程要设置,看下图,单击混编项目的设置(Settings...):
如下图,打开设置后,选择“Type Safe API”选项卡:
首先,选择我们在第一个过程中编写好的MatlabDemo.dll接口文件,选择后,程序会自动搜索该dll中的可用接口(公开的),在.NET interface下拉列表中显示,选择你需要的,这里我们是IMultiply,如下图所示的MatlabDemo.IMultiply,然后选择该接口和Matlab混编程序中对于的类,我们的multiply.m函数在DemoTest类中,如下图的Wrapped class:
设置完成之后,关闭即可。然后编译,如果没有问题,提示编译成功之后,打开编译好的文件夹,我们可以看到如下3个dll文件:
生成的3个文件,TypeSafeDemo.dll其实和普通的混编方式是一样的,可以和以前数据类型转换的方式一样使用;而DemoTestIMultiply.dll和TypeSafeDemoNative.dll这2个