【C#】VS2015调用Matlab2016a生成的dll文件、MWArray数据类型转换

系统环境:

  1. 用于生成dll文件的电脑:VS2015专业版,Matlab2016a,均为64位
  2. 用于调用dll文件的电脑:VS2015社区版,64位

生成dll文件

这部分网上教程非常多,可以参考:[MATLAB]将.m文件生成dll文件。

主要注意的几点:

  • visual studio要安装专业版,详见官方System Requirements and Supported Compilers。
  • VS安装时,自定义功能时要选择“适用于Visual C++2015的公共工具”和“Visual Studio扩展性工具”。
  • Matlab要是已经激活状态。

首次生成的步骤分3步(后面再生成只需要用deploytool):

  • Matlab的命令行窗口输入mbuild -setup
  • Matlab的命令行窗口输入mex -setup C++;
  • Matlab的命令行窗口输入deploytool,选择Library Compiler

调用dll

主要也是平台匹配的问题:

  • VS2015的安装需要选择“适用于Visual C++2015的公共工具”和“Visual Studio扩展性工具”。(调用可以用社区版的VS,生成只能用专业版)
  • 添加导出的dll文件和MWArray.dll(C:\ProgramFiles\MATLAB\R2016a\toolbox\dotnetbuilder\bin\win64\v2.0)的引用;
  • 工程文件的首行添加如下信息
using MathWorks.MATLAB.NET.Utility;
using MathWorks.MATLAB.NET.Arrays;
using matlab_class;
  • VS2015的“属性——>生成——>目标平台” 选择 x64

VS2015的参考安装项如下
【C#】VS2015调用Matlab2016a生成的dll文件、MWArray数据类型转换_第1张图片

【C#】VS2015调用Matlab2016a生成的dll文件、MWArray数据类型转换_第2张图片

MWArray数据类型

MWArray是MathWorks公司为其他语言调用matlab编译的dll设计出的一种数据类型。C#需要通过MWArray与MATLAB的数据进行互通,数据类型映射规则如下:

.NET Type MWArray Type MATLAB Type
System.Double MWNumericArray double
System.Number MWNumericArray double
System.Float MWNumericArray single
System.Byte MWNumericArray int8
System.Short MWNumericArray nt16
System.Int32 MWNumericArray int32
System.Int64 MWNumericArray int64
System.Char MWCharArray char
System.String MWCharArray char
System.Boolean MWLogicalArray logical
N/A MWStructArray structure
N/A MWCellArray cell

MATLAB生成的dll文件,返回的数据都是MWArray类型的,这是个抽象类,需要先转换成MW*****Array子类型,然后再转换成C#的数据类型。

  • MWArray——>C#数字
MWArray aaa = 10;
MWArray bbb = 10.1
int ccc = (MWNumericArray)aaa.ToScalarInteger();
double ddd = (MWNumericArray)bbb.ToScalarDouble();
  • MWArray——>C#字符串
MWArray ccc = "matlab";
string str = (MWCharArray)ccc.ToString();
  • MWArray——>C#二维数组
MWArray aaa = new double[2, 2] { { 1.1, 2.2 }, { 3.3, 4.4 } };
Array arr = (MWNumericArray)aaa.ToArray();
double[,] bbb = (double[,])arr;
  • MWArray——>C#一维数组
MWArray aaa = new double[] { 1.1, 2.2 };
Array arr = ((MWNumericArray)aaa).ToVector(MWArrayComponent.Real);
double[] bbb = (double[])arr;
// ToVector中的MWArrayComponent.Real是指复数中的实部。

更多关于MWArray数据类型的介绍可以参考:https://blog.csdn.net/zwjabcd/article/details/50663134

你可能感兴趣的:(C#)