工作中遇到一个需求,有一部分算法的代码需要MATLAB来进行处理,而最后需要集成到C#中的wpf项目中去,选择灵活性更高的dll,去进行集成。(可以简单理解为:将MATLAB的函数,变为C#中类的函数成员,进行相关调用和函数编写)
对于MATLAB的程序部分,不需要知道里面的MATLAB具体语法逻辑,它提供一个函数,函数可能需要传入参数,或许会有输出。 接下来,我将通过一个示例,来讲解一下将MATLAB接入wpf项目中,并且测试其效果。
1. 原始MATLAB程序,一个后缀为.m的文件
用MATLAB软件打开,可以看到,也就是这个.m文件具体能够实现什么功能点,为了保密原则,我将无关信息打码。内容主要就是一个函数,函数输入一个需要处理的数据所在的路径,最后输出处理的结果。(MATLAB中用 function end 来定义函数)
在原始软件中调用,也很简单,和普通的函数调用一样,在命令行窗口输入函数名加上参数,回车即可运行,会输出函数调用结果。
2.将MATLAB程序转为dll
1) 下载MCR
命令行窗口输入mcrversion看是否有下载MCR
如果提示没有,就 输入命令下载 mcrinstaller,或者自己去官网找相关的版本下载
等待下载完成后,再次输入指令 mcrinstaller 有路径则说明下载成功
2)MATLAB程序打包为dll
- 命令行输入deploytool
- 选择library complier
- 选择指定项、添加自己的.m文件(如果有多个.m文件,在第二步全部添加即可)、修改类名(可改可不改,c#中调用时会用)
设置好后,点击packet 打包,等待打包完成
会生成如下的文件结构
生成的dll文件在for_redistribution_files_only里
3) 将dll引入wpf程序
- 将readUSBData.dll(MATLAB程序生成的dll)文件复制到C#文件目录bin\Debug文件夹下
2.将MWArray.dll文件也复制到C#文件目录bin\Debug文件夹下,自行去安装位置寻找
- 项目中添加引用
添加using引用 :
using MathWorks.MATLAB.NET.Arrays;
using MathWorks.MATLAB.NET.Utility;
调用如下:
或者也可以在右边打开对象浏览器,来查看该dll的结构
4)修改运行的目标平台为 x64
修改后如下:
运行效果如下,和MATLAB中输出保持一致:
3. 文档看不明白的话,强推视频,跟着操作即可
链接:
参考文章
https://www.cnblogs.com/eniac12/p/4390845.html
https://www.cnblogs.com/straight/p/14612246.html
https://blog.csdn.net/yty2545340913/article/details/123127784
附代码
cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using MathWorks.MATLAB.NET.Arrays;
using MathWorks.MATLAB.NET.Utility;
namespace CSDNT
{
/// <summary>
/// MainWindow.xaml 的交互逻辑
/// </summary>
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
/// <summary>
/// 测试dll的button 后台代码逻辑
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void test_click(object sender, RoutedEventArgs e)
{
readUSBdata.Test test = new readUSBdata.Test();
var result = test.readUSBdata(@"C:\Users\rangu\Desktop\test\11");
Console.WriteLine(result);
}
}
}
xaml