Matlab生成dll,C#调用

版本:Matlab 2016a,VS2015

一 Matlab 生成dll

1 安装MCRInstaller

安装包的位置就在matlab的安装目录下,(…R2016b\toolbox\compiler\deploy\win64)

双击运行。此安装包主要是用于matlab打包文件所用。

2 编写matlab函数文件

function [result,absResult] = addme2(a,b)

switch nargin
    case 2
        result = a + b;
    case 1
        result = a + a;
    otherwise
        result = 0;
end

if nargout > 1
   absResult = abs(result);
end

3 用matlab将函数打包为C#可调用的dll文件 

  • 命令行输入deploytool
  • 选择library complier
  • 选择指定项、添加自己的.m文件(如果有多个.m文件,在第二步全部添加即可)、修改类名(可改可不改,c#中调用时会用)

 

 

  •  选择package,选择保存路径后, 进入打包过程,等待完成即可。

 4  生成的addme2.dll文件在路径/addme2\for_redistribution_files_only里;

        第二个文件是MWArray.dll(此文件的作用是c#与Matlab数据类型间的转换),路径是MATLAB\R2016b\toolbox\dotnetbuilder\bin\win64\v2.0

二 vs调用dll

1 引用右击添加两个dll文件,注意两个dll文件不能放在系统C盘里;

2 using添加,

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.Arrays;
using MathWorks.MATLAB.NET.Utility; using addme2; namespace WindowsFormsApplication3 { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { Class1 b = new Class1(); this.textBox1.Text = b.addme2((MWArray)6).ToString(); } } }

  

3 C#类型转换

无法将类型“double[]”隐式转换为“MathWorks.MATLAB.NET.Arrays.MWArray,用MWNumericArray。

MWNumericArray是MVArray的派生类。在VS的对象浏览器中查看了MWNumericArray各种构造方法,其中有一个构造方法是这样的:

public MWNumericArray(MathWorks.MATLAB.NET.Arrays.MWArrayComplexity complexity, params int[] dimensions)

输入的第一个参数是枚举型参数,有两个值分别是Real,另一个是Complex;然后输入矩阵的维数,由于有params关键字,所以可以创建指定大小矩阵。

//使用构造方法,构造一个10行2列的实数矩阵,使用for循环给每一个元素赋值
MWNumericArray plotValue = new MWNumericArray(MWArrayComplexity.Real, 10, 2);

注意Matlab中矩阵的下标是从1开始的,而C#是从0开始的。

把这个double数组强制转换成MWArray却是总是提示编译错误,无法进行强制类型转换。

解决:MWNumericArray赋给double[]的话可以采用MWNumericArray的ToArray方法。double[]赋给MWNumericArray直接赋值。

double[] arr = new double[] { 1, 2 };
double[] arr1 = new double[3];
MWNumericArray temp = arr;
arr1 = (double[])temp.ToArray(MWArrayComponent.Real);

三 问题

1 对mwcomutil.dll进行注册

先在电脑的高级设置的环境变量里添加MCR的安装路径MATLAB\runtime\win64,MATLAB路径也最好添加MATLAB\R2016b\bin\win64;环境变量不对会提示加载失败。

然后再在cmd(管理员)窗口输入:

regsvr32 mwcomutil.dllz

(这个dll是matlab下作的任何com组件都要用到的dll),下面在其他编译器下调用时就可以用了。

不过,我运行

regsvr32 /u mwcomutil.dll 

取消注册后程序仍能运行。(不清楚)

2 程序报错“addme2.Class1”的类型初始值设定项引发异常

 

x86修改为x64

 

 

 

https://blog.csdn.net/pitt_xiong/article/details/7777879

https://blog.csdn.net/qq_42063091/article/details/90702075

 

posted @ 2021-04-02 19:38  未闻花开  阅读(3621)  评论(0编辑  收藏  举报