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