陈红玲 周立平
摘要:简述了C#与Matlab混合编程的实际意义与应用领域,给出了混合编程的两种具体实现方法,最终分析了这两种方法在编程效率、软件复用度方面的优劣。
关键词:组件技术;C#;MATLAB
中图法分类号:TP311文献标识码:A文章编号:
The Analysis about Two Kinds Model of C# and Matlab Mix Programming
CHEN Hong-ling1,ZHOU Li-ping2
(1. Zhuhai college of Jilin University,Zhuhai 519041,China; 2.Guangdong Guohua Taishan electric factory,Taishan529228,China)
Abstract: A brief description about the practical significance and the application domain of C# and Matlab mix programming has been summarized, two kind of models to realize the mix programming have been given, the advantage and disadvantage of the two methods has been analyzed finally in the programming efficiency and software reusability aspect.
Keywords: Component technology;C#;MATLAB
1 引言
MATLAB是当今世界上使用最为广泛的数值计算软件之一,具有强大的矩阵计算能力,可以实现数值分析、优化、统计、偏微分方程数值解、自动控制、信号处理等若干个领域的数学计算[1]。C#是微软.NET战略中核心的开发工具,它综合了Visual Basic的高效率和C++功能的强大性,具有良好的界面设计功能,可以很方便地建立应用程序的可视化界面[2]。整合C#界面设计能力和MATLAB的科学计算能力,可以解决环境评价、金融计算、图像处理等多个领域的实际问题,具有很好的应用前景。
目前,采用VB、VC、C++ Builder等高级语言与MATLAB的混合编程技术已有较多的研究并且存在一定的应用成果,而C#是近几年微软新推出的编程语言,目前对于C#与MATLAB混合编程的研究还很少,本人在实践应用的过程中,总结了以下关于C#与MATLAB混合编程接口技术实现的经验。
2 DLL文件模式
利用MATLAB的编译工具中的mcc命令可以方便地将m文件转化为动态连接库文件(dll),但由于转化时是采用C或C++编译器,所以产生的dll文件可以由VC++直接调用,却不能被C#调用。但C#可以调用由VC++编译生成的dll文件,由此想到由VC++作为C#和MATLAB中间的一个桥梁,通过VC++把MATLAB生成的dll文件打包进VC++的dll文件中来,这样C#就可以间接地调用MATLAB生成的dll文件了。本文所用软件的版本为VC++6.0和MATLAB6.5,其中Matlab安装路径为D:MATLAB6p5,实现的具体步骤如下:
第一步:设置环境变量
① 在Matlab命令窗口中依次输入:mbuild –setup 和 mex –setup
② 选择VC++ 6.0编译器下的工具 → 选择 → 目录中的Include files添加D:\MATLAB6P5\EXTERN\INCLUDE路径,在Library files下添加D:\MATLAB6P5\EXTERN\LIB\WIN32\MICROSOFT\MSVC60路径。
第二步:使用mcc命令,将MATLAB中的m文件编译成dll文件
mcc –t -W libhg:dlltest -T link:lib test libmmfile.mlib
此例中mlib编译命令将test.m文件编译成C代码,函数接口为Jisuan( )。同时生成dlltest.exports、dlltest.h、dlltest.lib、dlltest.c、dlltest.dll、dlltest.mlib、dlltest.expt等文件。
第三步:在VC++中调用刚生成的dll文件,再打包制作成C#可以调用的dll文件
① 在VC++6.0中将生成后的dlltest.h、dlltest.lib、dlltest.dll三个文件拷贝到名为testMydll的测试工程目录下,并通过Project → Add To Project → Files将文件引入工程。
② 在testMydll.cpp中添加如下语句:
#include "dlltest.h"
void testMydll( )
{dlltestInitialize();
mlfJisuan_test();
dlltestTerminate();}
③ 在testMydll工程中新建一个名为testMydll.def的文件,在其中添加语句:
LIBRARY "testMydll.dll"
DESCRIPTION "Implement"
EXPORTS
testMydll @1
④将testMydll工程编译后在其Debug目录下将生成testMydll.dll、testMydll.exp、testMydll.lib等文件,其中testMydll.dll则是在C#中可以直接调用的dll动态链接库文件。
第四步:C#调用VC++编译生成的dll文件
将前面两步骤中由Matlab生成的dlltest.h、dlltest.lib、dlltest.dll三个文件和由VC++ 6.0中生成的testMydll.dll文件拷贝到C#的工程中,接着将bin和obj文件夹中的这四个文件导入工程,在工程的程序中添加语句:
[DllImport ( “testMydll.dll”, EntryPoint=”testMydll()”)] //调用dll文件声明
public static extern void testMydll(); //接口函数声明
testMydll(); //调用函数
3 COM组件模式
利用MATLAB的comtool工具可以方便地将m文件转化为COM组件,生成的COM组件只要在客户机上注册后即可像使用ActivX控件一样方便被调用,不同的编程语言可以对其实例化,通过传参数的方式加以复用。此方法的具体步骤如下:
第一步:在MATLAB中生成COM组件
①将Matlab生成的m文件保存名为test.m。在Matlab命令窗口中输入命令:comtool,打开COM Builder窗口。
②在该窗口中新建一个名为component的工程,并在该工程中添加文件test.m。
③点击Build → COM object命令,就可以生成COM组件,其版本号为component 1.0,该例中组件包含一个test类,向外提供一个接口函数为jisuan( )。在component工程的文件夹distrib下可以找到一个component_1_0.dll文件,这个文件即是所有遵循COM组件技术规范的高级语言都能够调用的COM组件。
第二步:在.NET中注册COM组件
在C#调用该COM组件之前,需先对其进行注册。在.NET开发平台中点击:Project → Add Reference…,在弹出的对话框中选择COM选项卡,选中刚生成的COM组件component 1.0,点击OK按钮即完成了组件的注册。
第三步:在C#程序中调用COM组件
①将component_1_0.dll文件拷贝到C#的工程文件夹下的Debug文件夹下,在.cs文件中添加命名空间:using component;
②在程序体中添加如下代码,将COM类实例化:
component.testClass Csharptest = new testClass();//实例化COM组件中的test类
Csharptest.jisuan( );//调用test类中的接口函数jisuan( )
4 两种模式的效率比较
由上可见,模式一步骤繁锁,而且还可能由于VC与C#语言细节上面不一致,使程序运行出错。比如VC语言中字符采用ASCII编码占一个字节,而C#语言中字符采用Unicode编码占两个字节,因此在传递字符参数时若不考虑这个问题,则将导致程序运行失败。
而模式二,步骤简单,调用方便,而且生成的COM组件只要在机器上注册后,便可跨语言甚至跨机器平台得以复用,软件的重用度好,编程效率高。同时生成的COM组件易于修改、扩展性好,利于系统的升级。在系统交付使用后,若需对原算法进行修改或更新,只需将修改后的COM组件覆盖原有的同名文件即可;而且系统运行速度也较快,因为应用程序仅仅在需要进行运算的时候才装载所需的组件库,这样减少了系统启动时间和内存占用。
5 结束语
整合C#优秀的界面设计能力和MATLAB强大的科学计算能力开发多领域的应用软件本身就具有良好的实际研究价值,文中给出的DLL文件和COM组件两种混合编程模式在实践中都切实可行,而后者由于用到了组件技术,故在编程效率、软件重用度等方面都略胜一筹。
参考文献:
[1] 苏金明.MATLAB7.0实用指南(第1版)[M].北京:电子工业出版社,2004,11.
[2] 毛尧飞,译..NET数据服务C#高级编程(第1版)[M].北京:清华大学出版社,2002,6.
投稿日期:
作者简介:陈红玲(1980-),女,汉族, 湖南郴州人,助教,硕士,研究方向为数据库技术。周立平(1977-),男,汉族,湖南郴州人,工程师,硕士,研究方向为嵌入式系统开发。