MATLAB程序转C# WPF,dll集成,混合编程

工作中遇到一个需求,有一部分算法的代码需要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程序

  1. 将readUSBData.dll(MATLAB程序生成的dll)文件复制到C#文件目录bin\Debug文件夹下

2.将MWArray.dll文件也复制到C#文件目录bin\Debug文件夹下,自行去安装位置寻找

  1. 项目中添加引用

添加using引用 :

using MathWorks.MATLAB.NET.Arrays;

using MathWorks.MATLAB.NET.Utility;

调用如下:

或者也可以在右边打开对象浏览器,来查看该dll的结构

4)修改运行的目标平台为 x64

修改后如下:

运行效果如下,和MATLAB中输出保持一致:

3. 文档看不明白的话,强推视频,跟着操作即可

链接:

https://www.bilibili.com/video/BV1Z54y157qz/?spm_id_from=333.337.search-card.all.click\&vd_source=2d0578bc27bdc3553296e35d0c76de2d

参考文章

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

相关推荐
2501_9307077810 小时前
使用C#代码更改 PowerPoint 幻灯片大小
开发语言·c#·powerpoint
Z_W_H_12 小时前
【C#】C#中值类型和引用类型参数传递的区别
开发语言·c#
技术净胜12 小时前
MATLAB进行图像分割从基础阈值到高级分割
opencv·计算机视觉·matlab
用户83562907805113 小时前
使用 C# 高效解析 PDF 文档:文本与表格提取实战指南
后端·c#
rit843249913 小时前
C#实现的远程控制系统
前端·javascript·c#
ChaITSimpleLove13 小时前
基于 .NET Garnet 1.0.91 实现高性能分布式锁(使用 Lua 脚本)
分布式·.net·lua
listhi52013 小时前
针对燃油运输和车辆调度问题的蚁群算法MATLAB实现
前端·算法·matlab
Dillon Dong14 小时前
Simulink进阶:从零打造你的自定义模块库并集成到浏览器
matlab·simulink
wuguan_15 小时前
C#中的静态成员、常量和只读变量
开发语言·c#
秋雨雁南飞15 小时前
C# SignalR 添加Swagger
c#·swagger·signalr