仅作为操作记录共享,大佬请跳过。
背景
博主第一次使用matlab与c#混合编程,经多方查阅和尝试,最终成功用c#调用博主使用matlab自编的一个简单函数sumfunc;
过程
0、 配置matlab编译器
第一步传送门
博主在完成matlab与c#混编第一步后,开始进行生成matlab的dll动态链接库和c#编程。
1、主要参考文献
博主使用一篇论文的两段具体操作阐述
和传送门一和传送门二
的内容,生成dll:
感谢众多大佬博主的优秀文章:
传送门一——visual studioC#调用MATLAB生成的DLL
传送门二——C# Matlab 相互调用
2、生成matlab的dll动态链接库
① 在matlab中,博主自己写了一个简单的加法函数,如下:
function y = sumfunc(x1,x2)
y=x1+x2;
end
② 在matlab的命令窗口输入指令:
setenv('MW_MINGW64_LOC','D:\TDM-GCC-64'),
③ 再输入指令:
mex -setup
④ 再输入指令
deploytool
⑤ 然后会弹出一个对话框,选择Library Compiler
⑥ 然后会跳转到如下对话框:
⑦ 进行设置
⑧ 在博主设置的(上图中的)保存路径下面,就出现了打包的文件sumfunc文件夹【有用】
和sumfunc.prj【没用】
:
点开sumfunc文件夹【有用】
后:
⑨ 一共只需用到两个dll:
一个是上图的sumfunc.dll
,另一个是matlab安装路径下的MWArray.dll
(传送门)
D:\matlab2019a\toolbox\dotnetbuilder\bin\win64\v4.0
至此,第二步动态链接库生成成功。
3、visual studio 新建项目和引用
① 新建c#控制台应用.Net Framework
② 添加两个dll的引用
:
③ 在Program.cs文件的代码
部分添加三行代码:
using MathWorks.MATLAB.NET.Utility;
using MathWorks.MATLAB.NET.Arrays;
using sumfunc;
至此,visual studio 的c#项目配置成功
4、写c#代码
sumfunc.Class1 sum = new sumfunc.Class1();
MWArray[] argsout = new MWArray[1];
MWArray[] argsin = new MWArray[] { 2,3 };
sum.sumfunc(1, ref argsout, argsin); // 对于Class类型使用 ref,是为了保持引用的地址是一致的。
MWNumericArray mw = argsout[0] as MWNumericArray;
double[,] res = (double[,])mw.ToArray();
string str = res[0, 0].ToString("F2");
Console.WriteLine(res);
Console.WriteLine(str);
Console.ReadKey();
优秀博主的代码讲解:
5、解决bug
博主运行后发现出现错误未经处理的异常: System.TypeInitializationException
,之后博主查找优秀博主文章的解决方案,即将Any CPU 改为x86,总结在博主的另一篇博文中,传送门
6、运行效果
然后,博主的visual studio 2019平台的c#控制台就可以通过matlab生成的dll调用matlab函数了:
博主也将代码和dll文件放在了资源库里,(不建议博友下载,可以先按照博主博文上的步骤操作,再解决一下特定的bug(因为不同电脑的出现的bug可能不同),一定能够做出。)有想先预览或看直观化流程的博友可以下载博主的代码文件传送门
(包括博主写的c#和平台生成的代码文件dll和matlab自带的dll以及参考的一篇论文,限于matlab2019a和visual studio2019的博友使用,其他版本博主不确定能否直接运行)