天天看点

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,成功后将出现随后的截图中的界面。按照红色划线的来输入。

asp.net下调用Matlab生成动态链接库

4、然后在MATLAB主界面,File->new->development Project,就会出现如图界面,在Name输入你的工程名字,然后在Target中选择.NET Assembly,然后点OK。如图所示:

asp.net下调用Matlab生成动态链接库

5、点了OK之后就会在MATLAB主界面的右边看到新的工具栏, 点击Add class,输入你想要的类名,然后在新建的类下点击"add file",把你想要在C#中调用的M文件加入进来。之后就会出现如下图情况:

asp.net下调用Matlab生成动态链接库

在这里需要你们肯定都要问如果我的m_3_read_sket_and_retrieve.m文件调用了其他m文件怎么办,那么你就需要在下面这个窗口添加所有你在m_3_read_sket_and_retrieve.m文件中所使用到的M文件(包括Mex文件),千万千万记住,你所有的m文件都没用使用过addpath函数,如果有使用到,请将其删除。如果存在一个M文件使用到了addpath函数,是会出错的。如图:

asp.net下调用Matlab生成动态链接库

6、最后点击上面这张截图中的build图标(一个方块上有3个指着它的箭头),等待一段时间让Matlab生成dll文件,成功后将会如图所示,将会在你的工程目录位置下生成一个文件夹和一个.prj文件。

asp.net下调用Matlab生成动态链接库

7、在工程目录下找到工程文件夹,在工程文件夹中将会看到两个文件夹,一个是distrib,另一个是src,src文件夹里面的文件是一些c#文件,将会指导你如何使用生成的类,而distrib文件夹中才是我们所要的dll文件。现在打开VS,打开你的工程,在工程属性下添加两个dll文件,如图

asp.net下调用Matlab生成动态链接库

其中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>"); 
        }
    }
}