C#Matlab混编——基于ASP.net空网站实现网页调用
考虑到算法模型较多、计算量较大、图形化处理等问题,利用原有的C#软件开发平台,没有提供足够的工具函数与计算能力,因此采用matlab与.net混编模式。
1. Matlab.net混编技术简介
MATLAB作为一款功能强大、效率高、交互性好的可视化高级计算机语言,在数值计算、自动控制、数字信号处理、图形处理、仿真、神经网络、小波分析等各个领域有着广泛的应用。MATLAB程序接口的出现,解决了matlab与其他程序之间的数据交换问题,通过接口与其他编程环境交互,各取所长,充分发挥MATLAB计算的优点所示。
通过使用MATLAB Builder NE,将MATLAB函数封装入.NET中类的方法,这些类就可以像其他托管代码一样被.NET环境下的所有语言调用,例如C#、VB.NET、J#、C++.NET、F#等语言,甚至是网络程序也可以调用,例如ASP.NET。
2. 混合编程的实施
1.配置编译平台
选取matlab2014a和vs2012,均为64位设置,同时需要注意的是一般matlab平台的版本要高于vs。
2.编写运行.m文件
创建名为test1.m的函数文件,功能是实现求平均数:
function [mean] =test1( x) n=length(x); mean=sum(x)/n; end
|
3.创建动态链接文件
在命令窗口输入并运行deploytool:
跳出编译选择窗口,选择library complier:
选择.Net Assembly,添加需要编译的函数文件,可更改组件名称及类名,参数设定后,选择package。
动态链接库文件创建好后,会跳出弹窗,我们需要的动态链接库文件在for_redistribution_files_only文件夹中:
4.创建空网站
打开vs2012,文件——新建——网站——Asp.net空网站,创建一个空网站;
右击网站项目名称,添加web窗体;
添加该网页前台内容,设置一个Button控件和一个Textbox控件:
<asp:Button ID="Button1" runat="server" Text="计算" onclick="Button1_Click"/>
<asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
添加网页后台内容:
1)命名空间添加,共三个,两个固定,一个是你自己命名的动态链接库组件名称:
using MathWorks.MATLAB.NET.Arrays;
using MathWorks.MATLAB.NET.Utility;
using test1;
2)添加函数内容:
protected void Button1_Click(object sender, EventArgs e)
{
MWNumericArray arr1 = new int[] { 1, 2, 3, 4, 5 };
Class1 Tc = new test1.Class1();
MWArray result = Tc.test1((MWArray)arr1);
this.TextBox1.Text = result.ToString();
}
5.添加matlab引用
右击项目名称,添加引用,在引用管理器里选择浏览,添加两个引用:
1)一个引用是在你的matlab安装目录下的MATLAB\MATLAB Production Server\R2014a\toolbox\dotnetbuilder\bin\win64\v2.0,选择后添加到列表中;
2)另一个引用是在你创建的m文件动态链接库文件所在,也就是for_redistribution_files_only文件夹中的dll文件;
最后将两个引用添加后,确定即可。
6.环境配置
最最重要的一环来临了,之前这个步骤走了好多弯路,因为一旦网页调试运行,就会出现初始化值错误的问题,经过不懈的努力终于找到了解决的办法,网上提供的很多办法也尝试过,可是木有用。。。。
因为我的matlab和vs均是64位的,所以创建的dll也是64位的,但是vs2012默认只会调用其32位版本,因此需要修改IIS配置,方法如下:
通过修改注册表来实现vs调用x64版IIS Express;
Cmd-regedit后到注册表界面:
HKEY_CURRENT_USER\Software\Microsoft\VisualStudio\11.0\WebProjects,右击——新建——DWORD,名称为“Use64BitIISExpress”,并修改属性值为“1”。
7.运行网站
关掉vs后,重新打开运行网站,可以实现网页调用成功。
8.如果后来再打开运行项目时,出现同样的错误,可以进行一下操作(打开vs节目,网站——IIS配置,估计是为了重新启动IIS配置)。