VB.NET 调用MATLAB的M文件(生成COM控件)

时间:2021-11-13 13:27:04

一.版本说明:VS2008MATLAB2010b

二、安装MCRInstaller

在路径C:\Program Files\MATLAB\R2010b\toolbox\compiler\deploy\win32

三、MATLAB命令窗口中配置环境

1. 输入: mbuild –setup 出现以下界面,我选择的是[2]自己的编译器,不是MATLAB自带的。

VB.NET 调用MATLAB的M文件(生成COM控件)

2.打开下图

 

VB.NET 调用MATLAB的M文件(生成COM控件)

3.然后弹出以下对话框

VB.NET 调用MATLAB的M文件(生成COM控件)

名字自己命,我的叫recognition.选择Generic COM Component。点击 “OK”。MATLAB右边出现以下界面

VB.NET 调用MATLAB的M文件(生成COM控件)

点击“Add class”,命名自己的类,我的叫recognition。点击”Add files”添加自己的M文件,我的主程序叫Multimeter1.调用的子程序是lianxu1和vcmubanpipei。。。在下边添加的是我的模板图片,程序用到的不需要改变的图片可以放这里。没有用到图片不用添加。

然后点击第一个图标,build

VB.NET 调用MATLAB的M文件(生成COM控件)

等待2-3分钟,就生成完了,如下图

VB.NET 调用MATLAB的M文件(生成COM控件)

到此,,就会在你选择的路径下生成了一个文件夹 recognition打开它

会有distrib和src两个文件夹。我们要的DLL在distrib里面。

VB.NET 调用MATLAB的M文件(生成COM控件)

这就是我要的DLL。。

如果在已经装上MATLAB的电脑上调用MATLAB的M文件,这个DLL就行了。如果要脱离MATLAB环境,我们需要打包。

VB.NET 调用MATLAB的M文件(生成COM控件)

添加 Add MCR ,将MCR打包进来。再点击第二个打包图标。在Build图标的右边。

打包完成,我的程序打包前的DLL只有2M,打包后有175M了。。。

刚才的distrib文件夹下多了一个.BAT文件。

还有一个EXE

到这里对MATLAB的操作结束。。。。。。。

DLL注册

MATLAB生成的DLL,注册之后的DLL才能够被工程引用。

VB.NET 调用MATLAB的M文件(生成COM控件)

三、对VB.NET的操作

1. 添加引用

添加MWArray.dll的引用,我的MATLAB2010b里面没有,在网上下,或者找更低版本的MATLAB,如MATLAB7.0 里面有的,考到自己电脑里边,然后对它添加引用。

添加MWComUtil.dll的引用,MATLAB下边有,自己找到,添加。

添加自己刚才制作的DLL。。我的叫recognition_1_0.dll

一共添加了3DLL,缺少一个都不行啊!!!

2 导入命名空间

VB.NET 调用MATLAB的M文件(生成COM控件)

 

3 调用DLL的程序

VB.NET 调用MATLAB的M文件(生成COM控件)

 

这是我的,第一句:对象化一个实例 dim ** as new 文件名.类名

第二、三、五、六句:设置函数的输入参数,我的参数有两个,一个是图片img一个是数字angle.

第四句:对象化输出参数

第七句:调用MATLABmultimeter函数,参数说明:“1

代表输出参数的个数;“result“是输出参数,img和angle是输入参数。这样我就可以得到结果了。我是对一张数字图像进行识别的程序,以下是结果。

VB.NET 调用MATLAB的M文件(生成COM控件)

重要说明:

1.。以上这用速度是很慢的,慢的原因是第一句,对象化实例的时候,如果这个函数要多次调用,我们希望程序只做一次实例对象,所以我将这几句放在模块里边:

VB.NET 调用MATLAB的M文件(生成COM控件)

程序改为:

VB.NET 调用MATLAB的M文件(生成COM控件)

这样第一次调用比较慢,后来速度就很快了。。

2. 之前调用DLL一直不成功,一直跳出提示框大概说 JVM 的虚拟内存不足,加大电脑虚拟内存也没有用,头痛了四天,最后原因可能是程序里面实例化对象太多,内存暴涨。

所以在加载窗口的程序中,我添加了好几句回收内存的语句,最后解决了。

GC.Collect()

3.如果MATLAB的M文件还需要用到一些图像,文本文件,将这些文件放入.NET工程下的BIN—DEDUG下边就好,这是默认的路径。

4.对MATLAB的调用生成COM比生成EXE速度更快,首选COM方法吧。

这是调用EXE的.NET程序,贴贴保留着,myexe.exe是MATLAB生成的EXE,一二三句话就是调用EXE.

Dim FileName2 As String  '执行MATLAB的EXE文件

FileName2 = Application.StartupPath & "\myexe.exe"

System.Diagnostics.Process.Start(FileName2)