C#调用由matlab生成的dll

暑假参加比赛时开发的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

posted on 2013-03-27 14:13  PacoYang  阅读(8147)  评论(0编辑  收藏  举报

导航