文章目录
一、A电脑使用matlab编写C#动态dll
1.1检查matlab是否关联编译器
本人是Matlab + vs2017 ,在matlab命令行输入>>mbuild -setup,如下图所示
若是提示找不到编译器:本人Visual Studio版本为2017,而MATLAB R2017a存在小bug,如果想要用VS2017的编译器,需要打一个补丁。而MATLAB R2017b已经修复了这个bug。
mscv2017以及MWarray.dll下载链接:link
提取码:eqj3
1.2编写Matlab调用函数
我编写的是计算sin输出值
1.3使用deploytool命令生成dll
在命令行输入>>deploytool,出现如下图所示的窗口:
选择Library Compiler
弹出dll参数设置界面
照如下步骤修改信息,最后生成dll文件。
出现如下等待界面。
最后生成的文件夹如下,选择for_…_only文件夹,
选择其中的testPlot.dll作为C#的引用dll文件。
二、B电脑安装MCR
根据计算机A上的的MATLAB版本到Mathworks官网下载对应版本的MCR,或者在计算机A上MATLAB命令行中执行如下命令:>>mcrinstaller
若是没有安装matlab,从这里下载Mcrinstaller.exe,本人是2017a版本的:
链接:link提取码:d74p
三、B电脑C#程序引用两个dll
3.1C#工程中使用生成的dll
首先引用MWArray.dll与生成的SinFunction.dll,然后使用三个命名空间
SinFunction
MathWorks.MATLAB.NET.Arrays
MathWorks.MATLAB.NET.Utility
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using SinFunction;
using MathWorks.MATLAB.NET.Arrays;
using MathWorks.MATLAB.NET.Utility;
namespace ConsoleApp2
{
class Program
{
static void Main(string[] args)
{
SinPlot myPlot = new SinPlot();
int[] Num = new int[10];
for(int i = 0; i < 10; i++)
{
Num[i] = i;
}
MWNumericArray input = Num;
MWNumericArray outPut;
outPut = (MWNumericArray)myPlot.CsharpPlot(input);
double[,] result = (double[,])outPut.ToArray();
foreach (var item in result)
{
Console.WriteLine(item);
}
}
}
}
运行结果:
3.2编译过程出现的问题:
1、MWarray.dll 版本不对
一定要与编译dll的A电脑中matlab路径下去找这个,否则版本会不一致
2、编译通过后,生成dll类的过程中失败,位数不一致导致的
3、命令空间识别但是dll类类型不识别。
.net FreameWork版本使用不对,编译的时候选择.net FreameWork 4。
四、缺陷
4.1编译位数问题
matlab64为生成64为dll,所以C#工程必须用64位编译
4.2,.net版本问题
若是使用了命令空间但是类型变量定义不识别,编译的时候选择.net FreameWork 4。
如有错误还请指出,感谢阅读。