首页 > 范文大全 > 正文

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

开篇:润墨网以专业的文秘视角,为您筛选了一篇Visual C#与Matlab混合编程在可视化软件中的应用范文,如需获取更多写作素材,在线客服老师一对一协助。欢迎您的阅读与分享!

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

关键词: Visual C# Matlab dll函数 混合编程 磁场可视化

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

Development on Its Visualization Software Based on Matlab and Visual C# Mixed Programming

LI Cheng-gang1, ZHao Jia-bao1, CHeN Zhao-rong2

(1.Nanjing University School of Management and engineering, Nanjing 210000; 2.PLa95874, Nanjing 210012)

【Abstract】 this article discovered the drawing programming of Matlab based on calling dll function with Visual C#, then realize the application of Visualization Software in Geomagnetic field with this method.

【Key words】 Visual C# , Matlab , dll function, Mixed Programming, Visualization in Geomagnetic Field

1 背景研究

1.1 Matlab的绘图功能

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

达式作图[1]。

1.2 Visual C#

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

1.3 混合编程

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

2 基于DLL的Visual C# 调用Matlab

2.1 C#中调用动态链接库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/unload assembly那样,可借助API函数,其中与动态库调用有关的函数包括下面几种:

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

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

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

可用IntPtr hModule=LoadLibrary(“Count.dll”);来获得Dll的句柄,用IntPtr farProc=GetProcAddress(hModu le,”_count@4”);来获得函数的入口地址。

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

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

2.2.1 编译器的设置

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

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

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

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

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

3.1 C#调用Matlab的绘图函数

编译环境:Microsoft Visual Studio 2010;Matlab R2010b

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

第二步,在Matlab的Command window中输入:“>> deploytool”,Matlab产生deployment tool配置窗口。新建工程------> Matlab Builder NE 选项卡----->. NET Component并添加工程名TestCshapMatlab---->点击ADD File按钮将需要编译的Matlab函数添加进当前工程---->点击build。等待编译成功,生成的文件在工程文件夹里面,Matlab的操作完成。

第三步,打开VISUAL Studio 2010新建C#工程名为TestCshapMatlabOfMatlab_consolt,添加引用draws.dll、MWArray.dll和MWUtility.dll。并加入命名空间:“using .Arrays; using MathWorks. .Utility;”下面是主要代码: private void DrawingImage(){

string datas = dataCollection.Text;//读取参数

draws.drawclass draw_1 = new draw.drawclass(); draw_1.draw(datas); //调用绘图函数

}

private void button2_Click(object sender, EventArgs e){ try{ if (pictureBox1.Image != null) { pictureBox1.Image.Dispose(); } this.DrawingImage();//图像显示

pictureBox1.Image = System.Drawing.Image.FromFile(@"d:\ draws.bmp");

}

catch (Exception ex)

{

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

}}

3.2 运行结果

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

图1 数据导入与读取

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

4 小结

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

参考文献

[1] 赵启蒙,高美娟.通过面向对象编程调用Matlab 绘图的实现[J].大庆石油学院学报,2004, 28(1):80-82. Zhao Qimeng, Gao Meijuan. Matlab mapping by object oriented programming[J]. Daqing Petroleum Institute ,2004, 28( 1) : 80- 82. (in Chinese)

[2] 肖永韧,解习农,刘晓峰.vc与Matlab混合编程之DLL实现方法[J].计算机工程与应用,2001,13:174-176. Xiao Yongren,Xie Xinong,Liu Xiaofeng. Mixed Programming Between Visual C++ and MATLAB Via Dynamic Link Libarary[J]. Computer Engineering and Applications, 2001,13:174-176. (in Chinese)