系统环境:
- 用于生成dll文件的电脑:VS2015专业版,Matlab2016a,均为64位
- 用于调用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的参考安装项如下
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