MSVS C# Matlab的混合编程系列1 - 看似简单的问题引出

这篇具有很好参考价值的文章主要介绍了MSVS C# Matlab的混合编程系列1 - 看似简单的问题引出。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言:

问题提出,如何把Matlab(本文简称MT)的算法集成到Visual Studio(本文简称VS)里面运行?

本文,通过编制一个MT中最简单的加法函数,我们把他做成 MSVS C#能够使用的动态库,说明了MSVS C# 和 MT集成的最小,然而,最简洁清晰的处理方法和过程。 


环境:

1 VS2019

2 C# .Net 应用环境

3 MT2019


写在前面的结论:

MT的库无论是安装版本还是Runtime,1 一定要用一致的版本 2一定要充分利用生成的移植文件,

一致版本,

  • 指的是MT的.net的框架和VSC3的.net框架版本一致,

  • 也包括MT的通用库版本比如,2019的库,和2022的库有可能不一致

  • 硬件平台设定的一致性
  • 利用MT的deploytool工具:

    • 生成动态库:
  • 在MSVS中,引入这个动态库:

  • 调用这个动态库的方法

  • 说明过程中遇到的三个容易忽视的问题:


步骤实录:

1 MATLAB中,设计一个简单的加法函数:

function result = addnum(a,b)
    result = a+b;
end

保存为add.

2 调用deploytool的库编译工具:

MSVS C# Matlab的混合编程系列1 - 看似简单的问题引出,# C#,# MATLAB,c#,matlab,开发语言

MSVS C# Matlab的混合编程系列1 - 看似简单的问题引出,# C#,# MATLAB,c#,matlab,开发语言

3 用Library Compiler进行编译:

3.1 VS C# 中选:

MSVS C# Matlab的混合编程系列1 - 看似简单的问题引出,# C#,# MATLAB,c#,matlab,开发语言

 3.2 可以改一名字:

MSVS C# Matlab的混合编程系列1 - 看似简单的问题引出,# C#,# MATLAB,c#,matlab,开发语言

 我们改成:doadd

MSVS C# Matlab的混合编程系列1 - 看似简单的问题引出,# C#,# MATLAB,c#,matlab,开发语言

 注意,Setting 里,路径最好改一下,否则,都到MT的路径里面去了:

MSVS C# Matlab的混合编程系列1 - 看似简单的问题引出,# C#,# MATLAB,c#,matlab,开发语言

路径笔者配置如下:

MSVS C# Matlab的混合编程系列1 - 看似简单的问题引出,# C#,# MATLAB,c#,matlab,开发语言

配置整体如下:

MSVS C# Matlab的混合编程系列1 - 看似简单的问题引出,# C#,# MATLAB,c#,matlab,开发语言

点击后,

MSVS C# Matlab的混合编程系列1 - 看似简单的问题引出,# C#,# MATLAB,c#,matlab,开发语言

MSVS C# Matlab的混合编程系列1 - 看似简单的问题引出,# C#,# MATLAB,c#,matlab,开发语言MSVS C# Matlab的混合编程系列1 - 看似简单的问题引出,# C#,# MATLAB,c#,matlab,开发语言

会在设定目录下,生成动态库移植的所有信息,同时,还会给出,参考的测试源码,其实就是调用方法,还有生成动态库部署所需要的种种方面。

一定要充分利用生成的移植文件,

现在,我们研究一下,这些生成的文件情况,

 3.3  不同路径下生成文件对比:

先看看,在输出文件夹的三个定义,

MSVS C# Matlab的混合编程系列1 - 看似简单的问题引出,# C#,# MATLAB,c#,matlab,开发语言
3.3.1 Testing files 文件夹(测试文件)

 MSVS C# Matlab的混合编程系列1 - 看似简单的问题引出,# C#,# MATLAB,c#,matlab,开发语言

 我们先看看,readme.txt

add MATLAB .NET Assembly (.NET Component)

1. Prerequisites for Deployment 【部署要求】

Verify that version 9.7 (R2019b) of the MATLAB Runtime is installed.   
If not, you can run the MATLAB Runtime installer.
To find its location, enter
  
    >>mcrinstaller
      
at the MATLAB prompt.
NOTE: You will need administrator rights to run the MATLAB Runtime installer. 

Alternatively, download and install the Windows version of the MATLAB Runtime for R2019b 
from the following link on the MathWorks website:

    https://www.mathworks.com/products/compiler/mcr/index.html
   
For more information about the MATLAB Runtime and the MATLAB Runtime installer, see 
"Distribute Applications" in the MATLAB Compiler SDK documentation  
in the MathWorks Documentation Center.

2. Files to Deploy and Package【部署,需要打包的文件】

-add.dll
   -contains the generated component using MWArray API. 
-addNative.dll
   -contains the generated component using native API.
-This readme file
    Note: if end users are unable to download the MATLAB Runtime using the
    instructions in the previous section, include it when building your 
    component by clicking the "Runtime included in package" link in the
    Deployment Tool.


Auto-generated Documentation Templates:【自动生成的文档模板】

MWArray.xml - This file contains the code comments for the MWArray data conversion 
              classes and their methods. This file can be found in either the component 
              distrib directory or in
              <mcr_root>*\toolbox\dotnetbuilder\bin\win64\v4.0

add_overview.html - HTML overview documentation file for the generated component. It 
                    contains the requirements for accessing the component and for 
                    generating arguments using the MWArray class hierarchy.

add.xml - This file contains the code comments for the add component classes and methods. 
                    Using a third party documentation tool, this file can be combined 
                    with either or both of the previous files to generate online 
                    documentation for the add component.


3. Resources【需要的资源】

【案,MWArray 在做加法运算的时候使用了,这里从哪里获取MWArray 的正确版本,也以后集成 其他库必要考虑的问题】

To learn more about:               See:
===================================================================
MWArray classes                    <matlab_root>*\help\toolbox\
                                   dotnetbuilder\MWArrayAPI\
                                   MWArrayAPI.chm  
Examples of .NET Web Applications  Web Deployment in the MATLAB   
                                   .NET Assembly documentation in the  
                                   MathWorks Documentation Center


4. Definitions

For information on deployment terminology, go to
https://www.mathworks.com/help and select MATLAB Compiler >
Getting Started > About Application Deployment >
Deployment Product Terms in the MathWorks Documentation
Center.

* NOTE: <mcr_root> is the directory where the MATLAB Runtime is installed on the target 
        machine.
        <matlab_root> is the directory where MATLAB is installed on the target machine.

 3.3.2 EndUser 文件夹(终端用户文件)

MSVS C# Matlab的混合编程系列1 - 看似简单的问题引出,# C#,# MATLAB,c#,matlab,开发语言

 里面就是真正需要加到MSVC C# 中去的动态库。

 MSVS C# Matlab的混合编程系列1 - 看似简单的问题引出,# C#,# MATLAB,c#,matlab,开发语言

 MSVS C# Matlab的混合编程系列1 - 看似简单的问题引出,# C#,# MATLAB,c#,matlab,开发语言

MSVS C# Matlab的混合编程系列1 - 看似简单的问题引出,# C#,# MATLAB,c#,matlab,开发语言

装完以下文件 

MSVS C# Matlab的混合编程系列1 - 看似简单的问题引出,# C#,# MATLAB,c#,matlab,开发语言


4 构建一个C#的项目,调用我们的MT的动态库:

4.1 构建一个窗体项目:

MSVS C# Matlab的混合编程系列1 - 看似简单的问题引出,# C#,# MATLAB,c#,matlab,开发语言

 【案,】框架的兼容性和MT一定要一致,否则,必出错!

4.2 设定一个Button,来触发MT动态库的调用

MSVS C# Matlab的混合编程系列1 - 看似简单的问题引出,# C#,# MATLAB,c#,matlab,开发语言

4.3 确保你的目标框架和MT是兼容的:

MSVS C# Matlab的混合编程系列1 - 看似简单的问题引出,# C#,# MATLAB,c#,matlab,开发语言

4.4 引入编好的动态库:

 MSVS C# Matlab的混合编程系列1 - 看似简单的问题引出,# C#,# MATLAB,c#,matlab,开发语言

MSVS C# Matlab的混合编程系列1 - 看似简单的问题引出,# C#,# MATLAB,c#,matlab,开发语言

MSVS C# Matlab的混合编程系列1 - 看似简单的问题引出,# C#,# MATLAB,c#,matlab,开发语言

4.5 配置好你 编译平台,X64大多数情况下:

MSVS C# Matlab的混合编程系列1 - 看似简单的问题引出,# C#,# MATLAB,c#,matlab,开发语言

5  插入调用dll库的代码:       

using MathWorks.MATLAB.NET.Arrays;
using add; // 这里改成你的库名,我们刚才编译的加法库
using MathWorks.MATLAB.NET.Utility;

6 运行结果展示:

 MSVS C# Matlab的混合编程系列1 - 看似简单的问题引出,# C#,# MATLAB,c#,matlab,开发语言


 可能遇到的问题:

1 兼容性问题:

1.1 框架兼容:

MT2019,在生成动态库的时候,下方有 .net 框架的说明,如下:

MSVS C# Matlab的混合编程系列1 - 看似简单的问题引出,# C#,# MATLAB,c#,matlab,开发语言

点击后,会有如下的一段GUIDE说明,

MSVS C# Matlab的混合编程系列1 - 看似简单的问题引出,# C#,# MATLAB,c#,matlab,开发语言

 错误信息:

末经处理的异常
始但攻正坝51友并吊。
第1个内部异常(共3 个》TypelnitializationException:“MathWorks.MATLAB.NET.Utility.MWMCR”的类型初始值设定项引发异常。

 MSVS C# Matlab的混合编程系列1 - 看似简单的问题引出,# C#,# MATLAB,c#,matlab,开发语言

1.2 MT 的通用动态库的兼容性:例如:MWArray.dll

MWArray.dll,

MSVS C# Matlab的混合编程系列1 - 看似简单的问题引出,# C#,# MATLAB,c#,matlab,开发语言

笔者之前用的是MT runtime的库,这样运行的时候总报错,然后,改成MT安装时候的安装目录下的库,就可以了。

MSVS C# Matlab的混合编程系列1 - 看似简单的问题引出,# C#,# MATLAB,c#,matlab,开发语言

2 项目引入的库不兼容:

这个在比较复杂的MT库里面,经常出现。

3 编译前没有执行清扫:

项目引入新的库,但是,项目编译前没有执行清扫的任务:

MSVS C# Matlab的混合编程系列1 - 看似简单的问题引出,# C#,# MATLAB,c#,matlab,开发语言

出错信息:

TypelnitializationException:“MathWorks.MATLAB.NET.Arravs.MWArray”的类型初始值设定项引发异常。

MSVS C# Matlab的混合编程系列1 - 看似简单的问题引出,# C#,# MATLAB,c#,matlab,开发语言

MSVS C# Matlab的混合编程系列1 - 看似简单的问题引出,# C#,# MATLAB,c#,matlab,开发语言


参考: 

 C#中调用MATLAB执行MATLAB代码_c#连接matlab connecting to matlab unknown_matlab-CSDN博客


源码:

本例项目工程源码已经上传,可在我的资源下载。 文章来源地址https://www.toymoban.com/news/detail-810964.html

到了这里,关于MSVS C# Matlab的混合编程系列1 - 看似简单的问题引出的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • C#学习系列之登录界面的简单数据库使用

    最近在练习界面的处理,在编写某登录界面的过程中采用到数据库的使用,简单的用户名与密码登录,在自己安装、创建数据库的表后,采用C#调用数据库,却一直会出现异常。因为在使用过程中采用了is_validation=1,反倒限制了try-catch的异常具体报错。通过此篇来记录一下数

    2024年02月04日
    浏览(27)
  • C#实现简单TCP服务器和客户端网络编程

    在C#中进行网络编程涉及许多类和命名空间,用于创建和管理网络连接、传输数据等。下面是一些主要涉及的类和命名空间: System.Net 命名空间: 这个命名空间提供了大部分网络编程所需的类,包括: IPAddress :用于表示IP地址。 IPEndPoint :表示IP地址和端口号的组合。 Socke

    2024年02月11日
    浏览(49)
  • 分析Flink,源和算子并行度不一致时,运行一段时间后,看似不再继续消费的问题,提供解决思路。

    之前有分析过一次类似问题,最终结论是在keyby之后,其中有一个key数量特别庞大,导致对应的subtask压力过大,进而使得整个job不再继续运作。在这个问题解决之后,后续又再次出现了积压的情况,针对这个问题进行排查分析。 通过以下这张图,可以看到当前它是没有数据积

    2024年02月12日
    浏览(33)
  • 「C#」异步编程玩法笔记-WinForm中的常见问题

    目录 1、异步更新界面 1.1、问题 1.2、解决问题 1.3、AsyncOperationManager和AsyncOperation 1.4、Invoke、BeginInvoke、EndInvoke及InvokeRequired Invoke InvokeRequired BeginInvoke EndInvoke 2、死锁 2.1、问题 2.2、 解决方法 2.2.1、不要await 2.2.2、用await代替Wait()/Result 2.2.3、使用新的异步方法中转 2.2.4、Config

    2024年02月01日
    浏览(26)
  • C#学习系列之UDP同端口收发问题

    想测试自己的程序问题,建立了两个UDP程序,一个往端口中接到数就传出去,另一个从这个端口接数据来解析。 出现的问题是 每次打开端口,另一个程序就无法接入。 最后通过调试发现,当两个程序都使用一下句子,只要添加多播组就会出现问题。 替换方案 只要简单声明

    2024年02月09日
    浏览(28)
  • 数学建模飞行管理问题最简单易懂方法matlab代码

    代码中六个角度for循环步长自己改改即可 在约 10,000 米高空的某边长 160 公里的正方形区域内,经常有若干架飞机作水平飞行。 区域内每架飞机的位置和速度向量均由计算机记录其数据以便进行飞行管理。当一架欲 进入该区域的飞机到达区域边缘时,记录其数据后,要立即计

    2024年04月26日
    浏览(67)
  • 【Matlab】混合整数规划

    链接 f、x、intcon、lb、beq、Ib和ub是向量,A和Aeq是矩阵 min ⁡ x f T x  subject to  { x (  intcon  )  are integers  A ⋅ x ≤ b  Aeq  x = b e q l b ≤ x ≤ u b min _{x} f^{T} x text { subject to }left{begin{array}{l} x(text { intcon }) text { are integers } \\\\ A cdot x leq b \\\\ text { Aeq } x=b e q \\\\ l b leq x leq u

    2024年02月04日
    浏览(25)
  • MATLAB+JAVA的混合开发

    近期项目中需要使用matlab跟java做混合开发。主要记录一下,此次开发遇到的问题点。 环境:使用的matlab版本是   R2018b。 当前状况:MATLAB代码已经编写好,且运行成功。需要打成jar包才可以被java调用。 步骤一: 按照教程安装好matlab后,打开matlab,查看当前matlab依赖的jdk版

    2024年02月10日
    浏览(33)
  • 利用 MATLAB 编程实现乘子法求解约束最优化问题。 拟 Newton 法

    1、画出 PH 法的算法流程图; 2、MATLAB 编写 PH 法求解约束优化问题的函数,无约束子问题用精确一 维搜索的拟 Newton 法((函数式 M 文件,精度设为 epson 可调);编写程序(命 令式 M 文件),调用 PH 法,求解如下问题:   初始点取(10,10),按教材 P217,例 12 取不同的参

    2024年02月11日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包