CSharp调用Matlab编译的dll

时间:2021-09-08 19:56:41


一、使用环境:Visual Studio 2010,Matlab7.11.0(R2010b),操作系统为64位,则对应的Matlab安装在Program Files文件夹下,而非Program Files(*86)。

WMArray.dll所在的全路径为:C:\ProgramFiles\MATLAB\R2010b\toolbox\dotnetbuilder\bin\win64\v2.0,可知WMArray为64位的dll。所以新建的CSharp工程对应的目标平台应为64.

CSharp调用Matlab编译的dll

二、操作步骤

1、matlab中安装MCRInstaller。其所在目录:C:\Program Files\MATLAB\R2010b\toolbox\compiler\deploy\win64。

双击,按提示安装即可。

2、安装Matlab编译器:在Matlab命令行输入mbuild -setup,设置编译器,在设置过程中会出现选择编译器的提示,我的电脑是装的VS2010:

  CSharp调用Matlab编译的dll

 

 3、运行deploytool,编译.net dll

在Matlab命令行中输入deploytool,出现如下窗口:

CSharp调用Matlab编译的dll

 

 Name:表示将要生成的dll文件名,本实例为LJF

Location:生成文件的位置,选择默认。

Target:因为是要用CSharp去调用Matlab的dll,所以选择.Net Assembly

CSharp调用Matlab编译的dll

注:我的Matlab装在了C盘目录下,默认工作路径为C:\Program Files\MATLAB\R2010b\bin。若打开Matlab时未用管理员的身份打开,则在该工作目录下建Deployment Project工程时会提示Save Failed错误:

 CSharp调用Matlab编译的dll

解决办法:1、以管理的身份启动Matlab。2、更改Location的目录

 

 单击Deployment Project对话框的OK按钮后,会出现以下窗口:

 

 CSharp调用Matlab编译的dll

编译前先要设置以下,在上图中点击Settings:

CSharp调用Matlab编译的dll

设置.NET。选择Microsoft Framework时一定要选当前使用版本。不能选default,要不然编译出来的会有点问题。

此处选择了3.5

 

(在64位的Windows 7下,用VS2010编译4.0以前的.Net项目会有问题。原因是一个叫Resgen.exe的玩意儿,是跑在64位环境下的,当他试图加载32位的可执行代码时,就会执行失败)

本测试实验新建的C#程序是.Net framework4.0

 

 

Add Class 添加LJF_Class类

Add files 添加 PolynominalFit.m文件:

如下内容:

 

function mm = PolynominalFit( m,n,x,j )
%功能:对输入n,及输出m,坐j次多项式拟合,
% 然后在拟合曲线上,找到x对应的值
nh=polyfit(n,m,j);    %拟合曲线
mm=uint8(polyval(nh,x));%多项式求值
end

 点击编译:

 CSharp调用Matlab编译的dll

编译时出现如下界面:会在我们指定的目录下面生成LJF工程,在LJF文件夹下包含两个子文件夹distrib,src。distrib文件夹包含我们要用的dll文件,src文件夹包含编译的源文件。

CSharp调用Matlab编译的dll

 

CSharp调用Matlab编译的dll

 

 三、打开VS2010,新建一个C# 窗体应用程序,记得选择.Net Framework3.5

     1、  导入matlab dll

CSharp调用Matlab编译的dll

MWArray的路径如下:C:\Program Files\MATLAB\R2010b\toolbox\dotnetbuilder\bin\win64\v2.0

   2、在C#中输入以下代码:

   

using MathWorks.MATLAB.NET.Utility;
using MathWorks.MATLAB.NET.Arrays;
using LJF;


  3、先学习一些基本常识

matlab中的数据与c#中数据的传递
我们先了解一下 MWNumericArray,它是 MWArray与 C#中数据传递的中间类。
MWNumericArray是 MWArray和 c#中数据的中间类,怎么用?怎样在 C#与 matlab间传递参数?
a.double型、 int型等数值类型的变量传递

MWNumericArray i = null, result = mydouble;
i=4;
myClass myclass = new myClass(); //实例化
result = (MWNumericArray)myclass.myfunc(i);


b.字符串 (需要用到 MWCharArray和 MWArray转换)
MWCharArray FileName = myString;
MWNumericArray sensitivity;
sensitivity = (MWNumericArray)myClass.myAlgorithm((MWArray)FileName);
c.多个输出参数组成的数组
MWNumericArray out_Arr = (MWNumericArray)out_Args[1]; //取出第一个参数返回的数组
(matlab返回的数组下界是从 1开始的)
取出数组中的一个元素值

mydouble=out_Arr[i].ToScalarDouble();

如上面例子 ToScalarDouble一类的 toXXXX等方法还有许多。

d.result.toArray可以把 matlab返回的矩阵变成 C#的 n x m数组, eg:

double[,] csArray= (double[,])result.ToArray(MWArrayComponent.Real);

e.将数组传入 Matlab(和传递单个数值的方法一样 )
double[,] dbx = new double[2, 2] { { 1, 2 }, { 3, 4 } };
MWNumericArray x=dbx;
myclass.picture(x);

 

4、测试VS程序

CSharp调用Matlab编译的dll

 

代码如下:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using MathWorks.MATLAB.NET.Utility;
using MathWorks.MATLAB.NET.Arrays;
using LJF;

namespace CSharpInvokeMatlabDll
{
    public partial class Form1 : Form
    {
        public Array mm;
        public Form1()
        {
            InitializeComponent();
            int[] x = { 0, 10, 20, 30, 40, 50, 60, 70, 80, 90, 100, 110, 120, 130, 140, 150, 160, 170, 180, 190, 200, 210, 220, 230, 240, 250, 255 };
            int[] y = { 34, 35, 36, 37, 38, 40, 43, 45, 48, 52, 58, 66, 74, 83, 92, 105, 115, 129, 149, 168, 185, 198, 212, 220, 223, 224, 224 };//27
            int[] p = new int[255];
            for (int i = 0; i < 255;i++ )
            {
                p[i] = i;
            }
            int n = 6;

            invgamma_Class mygam = new invgamma_Class();
            MWArray ResultOut = null;
            ResultOut = mygam.invgamma((MWNumericArray)x, (MWNumericArray)y, (MWNumericArray)p, (MWNumericArray)n);
            MWNumericArray temp = (MWNumericArray)ResultOut;

            mm = temp.ToArray(MWArrayComponent.Real);
        }

        private void button1_Click(object sender, EventArgs e)
        {
            int qq = Convert.ToInt16(textBox1.Text);
            if (qq<255&&qq>=0)
            {
                int pp = Convert.ToInt16(mm.GetValue(0, qq));
                textBox2.Text = pp.ToString();
            }
            else
            {
                MessageBox.Show("data error");
            }
        }
    }
}


 

 注意要将CSharp工程的目标平台设置为64位。

 

 

资源下载地址:http://download.csdn.net/detail/ivanljf/6504173


Matlab自带参考案例:D:\Program Files\MATLAB\R2010b\toolbox\dotnetbuilder\Examples\VS8\NET