暑假参加比赛时开发的winform程序里用到了matlab生成的dll,现在来总结一下具体过程。
我的开发环境是Visual Studio 2008和Matlab 2011
操作步骤:
1、matlab中安装MCR
MCR是MATLAB程序的运行底层支持,它打包了MATLAB运行所必需的支持全部库、组件,就像使用Visual Studio.net 发布的程序必须安装Frame框架一样。如果想在其他电脑上运行matlab文件,但是又没有安装matlab,则安装MCR这个matlab的运行环境即可。
MCR不用自己下载,如果你已经安装了matlab,在你安装目录中找MATLAB7\toolbox\compiler\deploy\win32 ,里面点击MCRInstall 按提示安装即可。
2、安装matlab编译器
安装完MCR后,打开你的matlab,在命令窗口中输入命令 mbuild-setup,设置编译器,在设置过程中会出现选择编译器的提示
我电脑带有的编译器是 Microsoft Visual C++ 2008 SP1
因此选择1即可,系统将自动安装。
3、运行deploytool,编译.net dll
写好你在matlab中的程序,我以一个简单的画图程序为例,程序内容是根据输入数组A的数据,画出直方图,其中数组A(0)代表一班人数、A(1)代表二班人数依次类推。代码如下。
function test(A) t=[1,2,3,4,5,6]; bar(t,A) set(gca,'XTickLabel',{'一班','二班','三班','四班','五班','六班'}) ; set(gca,'xtick',1:6); str=[num2str(A')]; text(t,A,cellstr(str))
编写成M文件后,在matlab命令窗口输入命令deploytool,在弹出的窗口中输入项目名、地址和编译类型,我们选择的是.NET Assembly
点击确认后出现以下窗口
我们在编译前要设置一下,点击中的Settings
设置.NET,设置如上图,选择microsoft framwork版本时一定要选单前使用版本,不能选 default,要不然编译出来的会有一点问题。将Assembly Type 设置为Shared点击Close回到编译窗口。
在编译窗口中,Add Class 为设置类名,Add File选择你的M文件,即编译后在C#的类函数。设定完后点击编译即可。编译结束后会在 test\src下会产生test.dll,这就是我们需求的 dll文件。
4.打开VS建立C#项目,导入dll引用
如何导入dll引用?只需要对着自己的项目点右键,在右键菜单中点击添加引用即可。注意,除了导入刚才自己生成的dll引用,你还需导入一个名为MWArray.dll的引用,他是matlab自带的引用,你可以在[Matlab安装位置]\R2009a\toolbox\dotnetbuilder\bin\win32\v2.0文件夹中找到。
添加完引用,当然不要忘了在类里using啦!在类开头写上
1 using MathWorks.MATLAB.NET.Arrays; 2 using MathWorks.MATLAB.NET.Utility; 3 using test;
5.C#编码
在C#编码中,我们调用matlab编写的dll的类时,输入与输出返回的数据类型都为MWArray,那么这个MWArray类型如何和C#中的数据类型进行交互呢?我们要先学习下面的知识
matlab中的数据与c#中数据的传递
我们先了解一下MWNumericArray,它是MWArray与C#中数据传递的中间类。怎么用?怎样在C#与matlab间传递参数?
a.double型、int型等数值类型的变量传递
MWNumericArray i = null, result = mydouble; i=4; myClass myclass = new myClass(); //实例化 result = (MWNumericArray)myclass.myfunc(i);
只要result转换成MWNumericArray类,那么就好办了,利用C#的转换类型函数就能转换成C#中的其他类型了,如Convert.ToDouble()一下就变成Double类型了。
b.字符串(需要用到MWCharArray和MWArray转换)
MWCharArray FileName = myString;
MWNumericArray sensitivity;
sensitivity = (MWNumericArray)myClass.myAlgorithm((MWArray)FileName);
c.多个输出参数组成的数组
MWNumericArray out_Arr = (MWNumericArray)out_Args[1]; //取出第一个参数返回的数组(matlab返回的数组下界是从1开始的)
取出数组中的一个元素值
mydouble=out_Arr[i].ToScalarDouble();
如上面例子ToScalarDouble一类的toXXXX等方法还有许多。
d.result.toArray可以把matlab返回的矩阵变成C#的n*m数组,eg:
double[,] csArray= (double[,])result.ToArray(MWArrayComponent.Real);
e.将数组传入Matlab(和传递单个数值的方法一样)
double[,] dbx = new double[2, 2] { { 1, 2 }, { 3, 4 } }; MWNumericArray x=dbx; myclass.picture(x);
这样针对你对数据类型的要求进行相应的转换,就能在c#中调用matlab的dll来进行计算了。当然,如果你的c#程序发布出来后,要在其他电脑上运行,那么这台电脑除了要装.net环境还要装MCR环境。
参考文章:http://wenku.baidu.com/view/a20207e919e8b8f67c1cb982.html