MATLAB 部署工具(Deployment Tool)的使用

MATLAB与C#混合编程

对于许多开发者而言,借助MATLAB提供的丰富的矩阵运算,实现需求算法,相比于纯手工实现底层算法具有较高的效率和较好的鲁棒性。但由于MATLAB需要借助自身的mcr运行时(runtime)才能在未安装有MATLAB的用户机上正常使用,这给许多开发者带来很多困扰,且通常在执行效率上也比原生代码实现的算法要低一些。如果能忍受MATLAB的上述问题,开发者则通常会把有GUI界面的MATLAB程序打包成应用程序分发给用户使用,或纯算法的MATLAB程序打包成库文件,供各类高级语言调用,实现多语言混合编程(互操作)。本文将以生成动态库为例,描述Deploy工具的使用过程和注意事项。

mcr运行时路径可以从安装目录下寻找,也可以前往官方网站搜索。
本地路径位于:
32位:X:\Program Files\MATLAB\R2018b\toolbox\compiler\deploy\win32
64位:X:\Program Files\MATLAB\R2018b\toolbox\compiler\deploy\win64
官网下载渠道:
https://www.mathworks.com/products/compiler/matlab-runtime.html

操作方法

首先,在MATLAB中完成核心算法的开发工作,经测试无误后,在命令行窗口输入:

>> deploytool

弹出MATLAB Compiler 对话框。

选择Libary Complier。


以生成.NET Framework 程序集为例,步骤如下:
1.在TYPE类型选项Tab页的列表框中,选择 .NET Assembly
2.点击右侧加号,添加你需要导出的函数文件;
3.选择 Runtime download from web 运行时从网页下载;
4.点击设置Setting按钮,设置额外的参数为“-C”(注意大写,至于为何设置后面会提及,检查输出路径后确认即可。

Option Description Comment
-c Generate C wrapper code. Equivalent to -T codegen
-C Direct mcc to not embed the deployable archive in generated binaries.
-d directory Place output in specified folder.

更详细的选项参数说明可以点击右上角帮助按钮。

5.在主窗口中,设置库文件名称等一系列属性,在命令空间和类名中,根据自己需求进行设置;

6.在主窗口中,设置库文件名称等一系列属性,在命令空间和类名中,根据自己需求进行设置;
7.确认各信息无误后,点击右上角的Package按钮进行打包,等待打包结束;

8.完成后,弹出输出的文件夹窗口,找到\MyLibary\for_testing路径下的扩展名为.ctf的文件;
9.再找到\MyLibary\for_testing路径下的MyClass源文件(即与自己定义的类名一致);
10.将上述两个文件拷贝到新建的一个空文件夹下备用;
11.打开Visual Studio集成开发环境,新建.NET Framework类型的类库项目,注意项目名称和之前在MATLAB中定义的命名空间名一致,如果不清楚的话,可以打开生成的源文件找到命令空间的名称;

12.新建完项目后,点击右侧解决方案,选中该项目右键,选择添加->现有项,找到扩展名为.ctf的文件和类的源文件;
13.添加完成后,选中.ctf文件,右键,选择属性,修改生成操作为“ 嵌入的资源 ”(此举是将ctf文件嵌入程序集,防止ctf文件意外丢失,导致运行出错);

13.打开MyClass文件,这个时候你会发现,IDE提示不存在MWMCR;
14.从MATLAB的安装路径下,找到X:\Program Files\MATLAB\R2018b\toolbox\dotnetbuilder\bin\win64\v4.0路径下的MWArray.dll文件,拷贝到本工程目录下,添加引用即可(值得说明的是,不同版本的MWArray不可混用,最好从自带的安装目录下找);
15.将静态构造函数中的源码从原来的

    /// <summary internal= "true">/// The static constructor instantiates and initializes the MATLAB Runtime instance./// </summary>static MyClass(){if (MWMCR.MCRAppInitialized){try{Assembly assembly= Assembly.GetExecutingAssembly();string ctfFilePath= assembly.Location;int lastDelimiter= ctfFilePath.LastIndexOf("\\");ctfFilePath= ctfFilePath.Remove(lastDelimiter, (ctfFilePath.Length - lastDelimiter));mcr= new MWMCR("MyLibary",ctfFilePath, true);}catch(Exception ex){ex_ = new Exception("MWArray assembly failed to be initialized", ex);}}else{ex_ = new ApplicationException("MWArray assembly could not be initialized");}}

更改为下述代码,其中,componetPath是指该程序集的路径,需要根据自己的情况更改为指定的路径。

    /// <summary internal= "true">/// The static constructor instantiates and initializes the MATLAB Runtime instance./// </summary>static MyClass(){if (MWMCR.MCRAppInitialized){try{Type type = MethodBase.GetCurrentMethod().DeclaringType;string _namespace = type.Namespace;//获得当前运行的AssemblyAssembly _assembly = Assembly.GetExecutingAssembly();//根据名称空间和文件名生成资源名称string resourceName = _namespace + ".MyClass.ctf";//根据资源名称从Assembly中获取此资源的Stream。即读取步骤13中嵌入的ctf文件资源。Stream stream = _assembly.GetManifestResourceStream(resourceName);//指定要加载资源的程序集位置。此处可以根据自己需求进行设置。//尤其是在使用反射动态加载程序集时,由于MATLAB自己编译的程序集,将路径绝对处理,导致动态加载程序集失败报错。string componentPath = _assembly.CodeBase;int firstDelimiter = ctfFilePath.IndexOf("///");componentPath = componentPath.Remove(0, firstDelimiter + 3);int lastDelimiter = componentPath.LastIndexOf("/");componentPath = componentPath.Remove(lastDelimiter, (ctfFilePath.Length - lastDelimiter));componetPath = componetPath + "/algorithm/MyClass";////此处的GUID编号75875807-c8ec-4756-aebc-e20bae8c9e16填该程序集中AssemblyInfo中暴露给COM的GUID编号mcr = new MWMCR("75875807-c8ec-4756-aebc-e20bae8c9e16", componetPath, stream, true);}catch (Exception ex){ex_ = new Exception("MWArray assembly failed to be initialized", ex);}}else{ex_ = new ApplicationException("MWArray assembly could not be initialized");}}

通过上述的过程即可解决小伙伴们在进行MATLAB与C#语言混合编程时,遇到的譬如
MWArray assembly failed to be initialized
MWArray assembly could not be initialized
等异常情况。

另外,对于需要使用.NET反射机制进行动态加载算法程序集的,此方法能够避免算法程序集与主程序二进制文件不在同一路径下报错问题。

MATLAB 部署工具(Deployment Tool)的使用——MATLAB与C#混合编程相关推荐

  1. c 与matlab混编,谈谈Matlab与C/C++或C#的互调用(混合编程)

    记得当初一个师姐问我知不知道如何在Matlab里调用C++的程序,还真把我问住了.因为我以前就知道C++调用Matlab的方法,这方面网上资料一大堆.没想到现在自己突发奇想又遇到另外一个问题,Matl ...

  2. wpf matlab混编,WPF(C#)与MATLAB混合编程

    WPF(C#)与MATLAB混合编程 WPF可以为开发者提供便捷地构建用户交互界面的解决方法,而matlab则在科学计算方面有着无与伦比的优势,因此在一些需要将科学算法转换为应用软件的项目中,需要应用 ...

  3. Matlab与C/C++混合编程 (基于Opencv库)

    之前用过基于VS2018 与MATLAB2018a 混合编程(C++特性)(见https://blog.csdn.net/wwwoowww/article/details/83013801),奈何后来 ...

  4. 几种替代MATLAB的工具,堪称完美!

    素材来源:EETOP 编辑整理:微信公众号strongerHuang|作者strongerHuang 近日,有哈工大学生表示收到了正版软件取消激活的通知,而在与 MATLAB 开发公司 MathWor ...

  5. 几种替代MATLAB的工具,一种堪称完美!

    关注.星标公众号,不错过精彩内容 来源:EETOP 编辑整理:strongerHuang 近日,有哈工大学生表示收到了正版软件取消激活的通知,而在与 MATLAB 开发公司 MathWorks 交涉之 ...

  6. 七种可以替代MATLAB的工具,一种堪称完美!

    EETOP综合整理自:百度百科.开源中国.EETOP论坛.紫丁香卫星 编辑整理:strongerHuan 前段时间,有哈工大学生表示收到了正版软件取消激活的通知,而在与 MATLAB 开发公司 Mat ...

  7. MATLAB之Curve Fitting Tool的使用及说明

    文章目录 MATLAB之Curve Fitting Tool的使用及说明 Curve Fitting Tool的使用 Curve Fitting Tool中表示拟合好坏程度的参数说明 MATLAB之C ...

  8. 【开发工具】学习记录 初学MATLAB

    转自:https://blog.csdn.net/An_Wu/article/details/70226197,感谢博主 关于如何学习Matlab 我的学习方法很简单:Matlab是练出来的,而不是看 ...

  9. 《量化投资:以MATLAB为工具》连载(1)基础篇-N分钟学会MATLAB(上)

    http://blog.sina.com.cn/s/blog_4cf8aad30102uylf.html <量化投资:以MATLAB为工具>连载(1)基础篇-N分钟学会MATLAB(上) ...

最新文章

  1. RabbitMQ 最常用的三大模式
  2. 阿里巴巴Java开发手册中的DO、DTO、BO、AO、VO、POJO定义
  3. Android里监视数据库的变化
  4. 用mac的safari浏览器调试ios手机的网页
  5. 超多种类的报表模板,填上数据就能用,全拿走!
  6. git多系统协作时换行符问题
  7. BT中的磁力链接(转)
  8. 关于内存条的知识要点⑴
  9. ORB SLAM论文
  10. 树莓派/Ubuntu联网以及查看本机的IP
  11. openjudge 1.9.8 白细胞计数
  12. springboot+vue+elementUI 校园志愿者管理系统#毕业设计
  13. UE4 本地化多语言
  14. W ndows xp 开机音乐,当年番茄花园Ghost XP的开关机音乐还记得吗?流传度媲美原版...
  15. python字典包含指定键_筛选python字典中键包含特定字符串的项
  16. Winfrom+Devexpress 之GridControl ConvertTo TileView 制作精美的卡片式看板
  17. 无法启动计算机上rasman,解决Windows无法启动Remote Access Connection Manager服务
  18. redis 源码分析 跳表实现
  19. oracle的dmp导出,oracle数据库dmp文件的导出和导入方法
  20. 异世界OL游戏怎样?

热门文章

  1. JAVA高级应用之手机通讯录的实现
  2. 经由unix域套接字传送文件描述符
  3. Adobe无法写入注册表值,请检查权限(错误代码:160)
  4. 科普:长度单位“米”是怎么得来的
  5. https://www.jianshu.com/p/444edecc556f(公众号本地调试)
  6. 浅谈手机app的推广
  7. C# LiveUpdate.exe实现文件在线更新(原理说明,使用指南一)
  8. 市面主流100G白盒交换机/裸机交换机评鉴指南
  9. 【JavaScript】
  10. MFC使用第三方CSpreadSheet