VisualC#与Matlab混合编程在可视化软件中的应用

点赞:5022 浏览:13111 近期更新时间:2024-04-05 作者:网友分享原创网站原创

摘 要:本文重点探讨了VisualC#基于dll函数调用Matlab绘图程序,进行混合编程的方法.并将该方法在地磁场可视化绘图软件的开发中加以应用.

关 键 词:VisualC#Matlabdll函数混合编程磁场可视化

中图分类号:TP311.52文献标识码:aDoI:10.3969/j.issn.1003-6970.2012.02.026

DevelopmentonItsVisualizationSoftwareBasedonMatlabandVisualC#MixedProgramming

LICheng-gang1,ZHaoJia-bao1,CHeNZhao-rong2

(1.NanjingUniversitySchoolofManagementandengineering,Nanjing210000,2.PLa95874,Nanjing210012)

VisualC#与Matlab混合编程在可视化软件中的应用参考属性评定
有关论文范文主题研究: 关于函数的论文范文检索 大学生适用: 高校毕业论文、学年论文
相关参考文献下载数量: 97 写作解决问题: 怎么写
毕业论文开题报告: 文献综述、论文前言 职称论文适用: 论文发表、初级职称
所属大学生专业类别: 怎么写 论文题目推荐度: 优秀选题

【Abstract】thisarticlediscoveredthedrawingprogrammingofMatlabbasedoncallingdllfunctionwithVisualC#,thenrealizetheapplicationofVisualizationSoftwareinGeomagicfieldwiththiethod.

【Keywords】VisualC#,Matlab,dllfunction,MixedProgramming,VisualizationinGeomagicField

1背景研究

1.1Matlab的绘图功能

Matlab是人们常用的科学及工程计算软件,具有强大的数据可视化功能,包括二维和三维的可视化、图象处理、动画和表

达式作图[1].

1.2VisualC#

C#是微软开发的一种面向对象的编程语言,是微软.NET开发环境的重要组成部分.而MicrosoftVisualC#2010是微软开发的C#编程集成开发环境,它是为生成在.NETFramework上运行的多种应用程序而设计的.C#简单、功能强大、类型安全,可实现应用程序的快速开发.

1.3混合编程

混合编程是指使用两种或两种以上的程序设计语言来开发应用程序的过程.目前,有很多深受欢迎的计算机上程序设计语言,它们有各自的优势和不足,混合编程可以扬长避短.广受好评的VisualC#和Matlab,二者混合编程必然有较好的应用前景.

2基于DLL的VisualC#调用Matlab

2.1C#中调用动态链接库DLL

动态链接库是一个独立的文件,不可直接执行,也不能接收消息,其中包含能被程序或其它DLL调用来完成一定操作的函数(方法).这些函数(方法)不是执行程序本身的一部分,而是根据进程的需要即时载入.

DLL只有在应用程序需要时才被系统加载到进程的虚拟空间中,成为调用进程的一部分,此时该DLL仅可被该进程的线程访问,其句柄可被调用进程所使用,而调用进程的句柄也可被该DLL所使用.在内存中,一个DLL仅有一个实例,且其编译与具体的编程语言和编译器都没有关系,因此可以通过DLL来实现混合语言编程.DLL函数中的代码所创建的任何对象(包括变量)都归调用其线程或进程所有.

使用DLL时有如下好处:

1)可减少在磁盘和物理内存中加载的代码的重复量,使用较少的系统资源.

2)有助于促进模块式程序的开发,使得程序开发更加便捷.3)简化部署和安装的过程.

2.1.1调用DLL中的非托管函数一般方法

首先,在C#语言源程序中声明外部方法,其基本形式是:

[DLLImport(“DLL文件”)]修饰符extern返回变量类型方法名称(参数列表)其中:

DLL文件:包含定义外部方法的库文件.

修饰符:访问修饰符,除abstract以外在声明方法时可使用的修饰符.

返回变量类型:在DLL文件中需调用方法的返回变量类型.方法名称:在DLL文件中需调用方法的名称.参数列表:在DLL文件中需调用方法的列表.

需要注意的是,要在程序声明中使用System.Runtime.InteropServices命名空间.DllImport只能放置在方法声明上.DLL文件必须位于程序当前目录或系统定义的查询路径中.返回变量类型、方法名称、参数列表必须与DLL文件中的定义一致.可通过EntryPoint属性设置,更改函数名等.

2.1.2动态装载、调用DLL中的非托管函数


对于全局函数,如果DLL中的非托管函数有一个静态变量S,每次调用这个函数的时候,静态变量S就自动加1.当需要重新计数时,就会出现和预想不同的结果.

首先,创建DLL可用DllImport调用DLL中的函数(方法),然后实现C#动态调用DLL中的函数(方法).C#中使用DllImport不能像动态load/unloadassembly那样,可借助API函数,其中与动态库调用有关的函数包括下面几种:

1)LoadLibrary(或MFC的AfxLoadLibrary),装载动态库.

2)GetProcAddress,获取要引入的函数,将符号名或标识号转换为DLL内部地址.

3)FreeLibrary(或MFC的AfxFreeLibrary),释放动态链接库.

可用IntPtrhModule等于LoadLibrary(“Count.dll”),来获得Dll的句柄,用IntPtrfarProc等于GetProcAddress(hModule,”_count@4”),来获得函数的入口地址.

在C#中没有函数指针,可通过结合使用System.Reflection.Emit及System.Reflection.Assembly里的类和方法达到相同的目的.

2.2如何用VC#来调用Matlab函数.

2.2.1编译器的设置

在Matlab的CommandWindow下运行”mbuildsetup”和“deploytool”.通常,运行”mbuildsetup”时,让系统自动搜索编译器就可以了.deploytool运行后,取一个工程名(例如testCshapMatlab),选择.NETComponent,会生成一个新工程.把sumab.m加入到新工程中,然后进行编译,工程目录下的Distrib目录里就会有testCshapMatlab.dll,可以供VC#使用.也可以直接编译Matlab里面自带的库函数.

打开VisualStudio2010,新建一个VC#工程,例如TestCshapMatlab项目.建好后,在SolutionExplorer里,鼠标右键单击References->AddReferences->Browse,加入生成的TestCshapMatlab\Distrib\testCshapMatlab.dll;重复操作,加入Matlab目录下的另一个dll文件,\toolbox\dotbuilder\bin\win32\v2.0\MWArray.dll.

环境设置好之后,就可以开始编程.在编程的开始可打开VC#工程里的主文件,例如UnitTestCshapMatlab1.cs.在文件的开始部分加入usingMathWorks.Matlab.NET.Arrays,需要画图,则加上usingMathWorks.Matlab.NET.Utility,

在数据的输入输出的问题上,如果遇到大的数据,输出可以使用Excel或SQL,数据的输入,可在Matlab中写输入数据的函数,这样可进一步提高效率.

3地磁场数据可视化软件开发实例

3.1C#调用Matlab的绘图函数

编译环境:MicrosoftVisualStudio2010;MatlabR2010b

第一步,如前文2.2.1所说进行Matlab编译器的设置.

第二步,在Matlab的Commandwindow中输入:“>>deploytool”,Matlab产生deploymenttool配置窗口.新建工程------>MatlabBuilderNE选项卡----->.NETComponent并添加工程名TestCshapMatlab---->点击ADDFile按钮将需要编译的Matlab函数添加进当前工程---->点击build.等待编译成功,生成的文件在工程文件夹里面,Matlab的操作完成.

第三步,打开VISUALStudio2010新建C#工程名为TestCshapMatlabOfMatlab_consolt,添加引用draws.dll、MWArray.dll和MWUtility.dll.并加入命名空间:“usingMathWorks.Matlab.NET.Arrays,usingMathWorks.Matlab.NET.Utility,”下面是主要代码:privatevoidDrawingImage(){

stringdatas等于dataCollection.Text,//读取参数

draws.drawclassdraw_1等于newdraw.drawclass(),draw_1.draw(datas),//调用绘图函数

}

privatevoidbutton2_Click(objectsender,EventArgse){try{if(pictureBox1.Image!等于null){pictureBox1.Image.Dispose(),}this.DrawingImage(),//图像显示

pictureBox1.Image等于System.Drawing.Image.FromFile(@"d:\draws.bmp"),

}

catch(Exceptionex)

{

MessageBox.Show(ex.Message,"异常"),

}}

3.2运行结果

编译运行即可看到输出,点击导入数据,将事先采集的数据文件“数据.txt”读取,如图1.

图1数据导入与读取

数据导入成功以后,点击绘图,得到如图2所示结果.

4小结

本文探讨VisualC#与Matlab混合编程具体方法和实例开发,并解决了参数传递问题.利用Matlab强大的数学计算能力和绘图功能,VisualC#调用Matlab函数,能够更加便捷的开发工程应用软件.