VS2015 MATLAB混合编程之COM组件
2017-11-04 22:31
260 查看
原地址:VS2015 MATLAB混合编程之COM组件_梦中萤火虫_新浪博客 http://blog.sina.com.cn/s/blog_8d5bae080102x792.html
概述:利用m文件生成dll再由vs2015的c#程序调用。
1:matlab编译器设置
在Command Window窗口中输入mex-setup和mbuild –setup查看编译器,如果没有,需将编辑器设置为相应的vs,下图为matlab2015b调用vs2015的正确截图。
点评:这一步花了太久太久的时间,因为电脑上最开始装的是matlab2012b ,早版本的matlab都有自带的编译器,输入mex-setup出来的是自带的编译器。最开始按照网上的教程“matlab要找windows sdk的mt.exe,找不到报错.因为vs2013在安装时,windows sdk的mt.exe位置变了,而matlab还是按照老的路径找,肯定找不到.解决:网上找到相应文件,将mbuildopts和mexopts两个文件夹复制到 (matlabroot)\bin\win64 下,(matlabroot)是matlab的安装目录”。按照各种博客一步步改了mbuildopts和mexopts两个文件夹里面的文件内容,仍然行不通,这个方法有待考察。
忙了一天所以最后重装了matlab2015b, 就可以连接上编译器了。
2:安装MCRinstaller.exe
位置在安装目录下的toolbox\compiler\deploy\win64文件夹中。
3:注册dll
对mwcomutil.dll进行注册。这个dll文件位于安装目录下的\bin\win64文件夹中(右键点击开始,命令提示符(管理员),cd+’空格’+路径,regsvr32 mwcomutil.dll)
4:生成.m文件
这是我所使用的函数,名称为add
function [c]=add(a,b)
c=a+b;
end
5:生成dll文件
在在Command Window窗口中输入deploytool,并选择Library Complier,按照下图进行配置,选择Generic COM Component类型;然后把add.m文件添加到project里面,其中Class name 为在c#中所调用的类的名字。最后点上面菜单条上的package.
然后生成,那个add.dll就是c#将要调用的dll文件.
6、开始写c#
引用添加之前生成的那个dll文件。
最后就可以运行查看结果了,运行比较慢=。=
总而言之一个小的case就算跑通了,走下来主要卡在了第一步连接编译器,各种版本的软件之间的兼容性啊适用性啊都很玄乎,网上的教程也都是五花八门。如果不是重装的2015b这么强大,我估计还要折腾好久。
参考:http://blog.sina.com.cn/s/blog_6f7265cf0101nqpi.html
http://blog.csdn.net/qq_22033759/article/details/48122383
=============分割线:后续碰到的问题=====================
1:返回值的个数
a.add(1, ref result, 5,6);//1表示返回的结果数量,要小于等于matlab对应函数实际的返回值数量。
2:返回的类型
c#中返回的结果是object类型,那么当返回的是数组,C#中如何进行类型的转化。这个查了很久的文献
http://bbs.csdn.net/topics/330032260 以及http://blog.csdn.net/zzhays/article/details/13623151
诸如上面两篇试过很多种方法,最后想到一种土方法:(double[,])result_x;这样就能直接用了,值得注意的是matlab中的1维数组到c#中会变成2维的。
3:一个dll中多个方法
修改类名,每一个类名对应一个方法。
概述:利用m文件生成dll再由vs2015的c#程序调用。
1:matlab编译器设置
在Command Window窗口中输入mex-setup和mbuild –setup查看编译器,如果没有,需将编辑器设置为相应的vs,下图为matlab2015b调用vs2015的正确截图。
点评:这一步花了太久太久的时间,因为电脑上最开始装的是matlab2012b ,早版本的matlab都有自带的编译器,输入mex-setup出来的是自带的编译器。最开始按照网上的教程“matlab要找windows sdk的mt.exe,找不到报错.因为vs2013在安装时,windows sdk的mt.exe位置变了,而matlab还是按照老的路径找,肯定找不到.解决:网上找到相应文件,将mbuildopts和mexopts两个文件夹复制到 (matlabroot)\bin\win64 下,(matlabroot)是matlab的安装目录”。按照各种博客一步步改了mbuildopts和mexopts两个文件夹里面的文件内容,仍然行不通,这个方法有待考察。
忙了一天所以最后重装了matlab2015b, 就可以连接上编译器了。
2:安装MCRinstaller.exe
位置在安装目录下的toolbox\compiler\deploy\win64文件夹中。
3:注册dll
对mwcomutil.dll进行注册。这个dll文件位于安装目录下的\bin\win64文件夹中(右键点击开始,命令提示符(管理员),cd+’空格’+路径,regsvr32 mwcomutil.dll)
4:生成.m文件
这是我所使用的函数,名称为add
function [c]=add(a,b)
c=a+b;
end
5:生成dll文件
在在Command Window窗口中输入deploytool,并选择Library Complier,按照下图进行配置,选择Generic COM Component类型;然后把add.m文件添加到project里面,其中Class name 为在c#中所调用的类的名字。最后点上面菜单条上的package.
然后生成,那个add.dll就是c#将要调用的dll文件.
6、开始写c#
引用添加之前生成的那个dll文件。
最后就可以运行查看结果了,运行比较慢=。=
总而言之一个小的case就算跑通了,走下来主要卡在了第一步连接编译器,各种版本的软件之间的兼容性啊适用性啊都很玄乎,网上的教程也都是五花八门。如果不是重装的2015b这么强大,我估计还要折腾好久。
参考:http://blog.sina.com.cn/s/blog_6f7265cf0101nqpi.html
http://blog.csdn.net/qq_22033759/article/details/48122383
=============分割线:后续碰到的问题=====================
1:返回值的个数
a.add(1, ref result, 5,6);//1表示返回的结果数量,要小于等于matlab对应函数实际的返回值数量。
2:返回的类型
c#中返回的结果是object类型,那么当返回的是数组,C#中如何进行类型的转化。这个查了很久的文献
http://bbs.csdn.net/topics/330032260 以及http://blog.csdn.net/zzhays/article/details/13623151
诸如上面两篇试过很多种方法,最后想到一种土方法:(double[,])result_x;这样就能直接用了,值得注意的是matlab中的1维数组到c#中会变成2维的。
3:一个dll中多个方法
修改类名,每一个类名对应一个方法。
相关文章推荐
- matlab2014调用vs2015进行混合编译生成mex文件
- 一个基于COM组件的Matlab与C#混合编程实例
- Matlab 2016a和VS2013混合Dll编程步骤
- OpenCV Mat 只能用静态数组定义时初始化,动态数组赋值给Mat需要逐元素进行. MATLAB,OpenCV,VS混合编程
- Matlab2014a使用VS2015混合编译-低版本matlab支持高版本的vs的方法
- vs2013中使用matlab2014b引擎实现c++和matlab混合编程
- matlab和c++混合编程---matlab和vs的环境配置问题
- Matlab混合编程之COM组件(C#篇)
- VC++与Matlab混合编程之引擎操作详解(3)引擎API详解
- VC++与Matlab混合编程之一:调用Matlab引擎
- 关于matlab与c#混合编程产生的移植问题
- matlab与VC++进行混合编程
- Visual Studio 与 Matlab实现混合编程
- matlab与c#混合编程之图像参数传递
- C++Builder与Matlab7.1混合编程环境设置
- 浅谈VC6和MATLAB混合编程之COM组件
- Visual Studio 与 Matlab实现混合编程
- 【Fltk】Fltk1.3.3+VS2015 编程
- matlab2015和vs2013混合编程
- Matlab混合编程之C++SL(C++篇)