asp.net下调用Matlab生成动态链接库
对于这次论文项目,最后在写一篇关于工程的博客,那就是在asp.net下调用matlab生成的dll动态链接库。至今关于matlab,c/c++(opencv),c#(asp.net)我总共写了4篇配置的博客,配置问题搞了我们差不多2周多的时间,各种编译不通过,各种链接出问题,各种头疼,甚至都有放弃asp.net下建工程,转用matlab的gui来实现前端界面的念头了。但是在队友的强烈要求下,我不得不硬着头皮搞下这配置问题,最终总结出这4篇配置博客。其中艰辛,恐怕连队友都不甚了解。
当然在实验室同学的帮助下,最后一个配置(asp.net+matlab)也最终成功通过了编译,首先先转一下实验室同学所写的配置方法,虽然我是按照他的方法进行配置,但是我们有自己的新问题。
下面先转他的博客:http://user.qzone.qq.com/1033932438
然后我就记录我是怎么配置的:
1、安装Matlab,我安装的Matlab版本那是2012a,记得千万要安装32位的Matlab版本,之前我也是安装64位的matlab结果,vs2010的ASP.NET Development Server怀疑不支持64位的,所以虽然编译能通过,但是在网页中显示就会出错。不过神奇的是,我尝试过很多配置结果曾经在win7+IIS下能够成功运行64位Matlab编译出的dll文件(有心人可以试试)。同样的我从同学那拷贝一个安装matlab32位的链接:http://wenku.baidu.com/link?url=52lt-eO7dnNf5XEvjbNWybs3qJV4npd0MBhEdJi75ziqXyI-Oyk-EvwXlGMMQSF-Y9J1vcOqW4jusOgAE8Jjkll7T63JYIR6GZE1USYB_Yi
2、安装好Matlab后,找到其安装根路径下的toolbox\compiler\deploy\win32,有个“MCRInstaller.exe”,安装之。安装过程直接傻瓜式的点确定。
3、打开Matlab,在command window下输入"mbuild -setup",然后如下图中展示的顺序,敲入指令执行,来进行Matlab与编译器的挂接。当最后那行中敲入“y”,回车后,Matlab将连接你选择的VS,成功后将出现随后的截图中的界面。按照红色划线的来输入。
4、然后在MATLAB主界面,File->new->development Project,就会出现如图界面,在Name输入你的工程名字,然后在Target中选择.NET Assembly,然后点OK。如图所示:
5、点了OK之后就会在MATLAB主界面的右边看到新的工具栏, 点击Add class,输入你想要的类名,然后在新建的类下点击"add file",把你想要在C#中调用的M文件加入进来。之后就会出现如下图情况:
在这里需要你们肯定都要问如果我的m_3_read_sket_and_retrieve.m文件调用了其他m文件怎么办,那么你就需要在下面这个窗口添加所有你在m_3_read_sket_and_retrieve.m文件中所使用到的M文件(包括Mex文件),千万千万记住,你所有的m文件都没用使用过addpath函数,如果有使用到,请将其删除。如果存在一个M文件使用到了addpath函数,是会出错的。如图:
6、最后点击上面这张截图中的build图标(一个方块上有3个指着它的箭头),等待一段时间让Matlab生成dll文件,成功后将会如图所示,将会在你的工程目录位置下生成一个文件夹和一个.prj文件。
7、在工程目录下找到工程文件夹,在工程文件夹中将会看到两个文件夹,一个是distrib,另一个是src,src文件夹里面的文件是一些c#文件,将会指导你如何使用生成的类,而distrib文件夹中才是我们所要的dll文件。现在打开VS,打开你的工程,在工程属性下添加两个dll文件,如图
其中MWArray能够在Matlab安装目录下找到,我的路径是E:\Program Files (x86)\MATLAB\R2012a\toolbox\dotnetbuilder\bin\win32\v2.0。
8、添加引用成功后,就开始写代码了在开头加入这三行:
using MathWorks.MATLAB.NET.Arrays; using MathWorks.MATLAB.NET.Utility; using CS_Online;
然后在使用时,如下图这样调用:
MWNumericArray frontSket = new MWNumericArray(frontDrawDataArray); MWNumericArray sideSket = new MWNumericArray(sideDrawDataArray); MWNumericArray topSket = new MWNumericArray(topDrawDataArray); CSRetrieval csr = new CSRetrieval(); csr.M_3_read_sket_and_retrieve(frontSket, sideSket, topSket);
9、如果配置没问题的话,就会看到结果了,上面讲的代码都是自己的代码的一部分,下面给一个demo:
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; using MathWorks.MATLAB.NET.Arrays; using MathWorks.MATLAB.NET.Utility; using csdemon; namespace WebApplication1 { public partial class _Default : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { double[,] array2D1 = new double[,] { { 1, 2 }, { 3, 4 }, { 5, 6 }, { 7, 8 } }; double[,] array2D2 = new double[,] { { 1, 2 }, { 3, 4 }, { 5, 6 }, { 7, 8 } }; double[,] array2D3 = new double[,] { { 1, 2 }, { 3, 4 }, { 5, 6 }, { 7, 8 } }; MWNumericArray a1 = new MWNumericArray(array2D1); MWNumericArray a2 = new MWNumericArray(array2D2); MWNumericArray a3 = new MWNumericArray(array2D3); myMathClass myMathDemon = new myMathClass(); MWArray result = myMathDemon.addm(a1, a2); MWNumericArray r = (MWNumericArray)result; double[,] location = (double[,])r.ToArray(); string str = ""; for (int i = 0; i < 4; i++) { for (int j = 0; j < 2; j++) { str += location[i, j]; str += " "; } } Response.Write("<script>alert(‘" + str + "‘)</script>"); } } }
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。