Qt调用Matlab库C#库dll调用C++调用C#库CSharp库lib invoke matlab library .net donet netframework

该文章是一篇说明c++/Qt调用C#库的例子及代码,主要是本人在工作中尝试调用C#过程中,出现了很多的问题,以至于花了很长时间才有些头绪,这也是为了帮助即将有此需求的您,也是为了记录我的操作过程,以便下次不再花费长时间。
我整个过程是使用Matlab转.net库,CLI接口调用Matlab库,使用的是vs2019,matlab2022,Qt5.14.2,windows10系统。所有的代码只是为了测试使用,请根据自己需求修改。该过程中包含算法输入输出的转换方法,这也是过程中的重点所在。
废话少说,开始吧。。。
1、Matlab代码

function [doubleArg, stringArg] = MyAlgoTest(doubleArg1 ,doubleArg2, stringArg3)
%MYALGOTEST 此处显示有关此函数的摘要
%   此处显示详细说明doubleArg = doubleArg1 + doubleArg2;
stringArg = stringArg3 + "_Matlab";end

2、deploytool命令转换为.net库

3、建立C#工程,并加入上面生成的matlab库,和Mwarray库

C#代码

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;using MyAlgoTest;
using MathWorks.MATLAB.NET.Arrays;namespace LibCSAlgo
{public class CSClass{//function [doubleArg, stringArg] = MyAlgoTest(doubleArg1 ,doubleArg2, stringArg3)public string InvokeMatlabAlgo(double arg1, double arg2, string arg3, out double outArg1, out string outArg2){string error = "";System.Console.WriteLine("ARG1 = ", arg1);System.Console.WriteLine("ARG2 = ", arg2);System.Console.WriteLine("ARG3 = ", arg3);TestClass c = new TestClass();MWArray[] outData = c.MyAlgoTest(2, arg1, arg2, arg3);outArg1 = (double)(MWNumericArray)outData[0];outArg2 = outData[1].ToString();System.Console.WriteLine("outArg1 = ", outArg1);System.Console.WriteLine("outArg2 = ", outArg2);return error;}}
}

4、建立CLR库工程,如果无此选项,需要通过vs安装程序安装CLI支持

5、CLR库代码

#include "pch.h"#include "LibCLRWapper.h"#include <msclr/marshal_cppstd.h>
#include <iostream>#using "LibCSAlgo.dll"using namespace LibCSAlgo;
using namespace System;
using namespace System::IO;
using namespace msclr::interop;gcroot<CSClass^>* g_csclass = new gcroot<CSClass ^>; //全局变量定义
//CSClass^ g_csclass = gcnew CSClass; //不能使用此方法定义全局托管变量,报错LibCLRWapper::CLRClass::CLRClass()
{*g_csclass = gcnew CSClass();
}std::string LibCLRWapper::CLRClass::InvokeMyAlgo(double arg1, double arg2, const char* arg3, double& oArg1, char** oArg2)
{System::String^ outString_ = gcnew System::String("");System::String^ stringArg = gcnew System::String(arg3);double outDouble = 0;System::String^ outData = (*g_csclass)->InvokeMatlabAlgo(arg1, arg2, stringArg, outDouble, outString_);int stringLen = outString_->Length;std::string oo = marshal_as<std::string>(outString_);memcpy(*oArg2, oo.c_str(), stringLen);oArg1 = outDouble;std::cout << "\n\nThis is CLR:" << std::endl;std::cout << "outDouble:" << outDouble<< std::endl;std::cout << "outString:" << oo << std::endl;outData = "No Error";return marshal_as<std::string>(outData);
}
#pragma once#include <string>//不要在此h文件中using namespace 有关c#的空间,因此可能会与windows.h的空间冲突,建议只在cpp中using# if defined LIB_CLRLibrary
#  define CLRLIBRARY_EXPORT __declspec(dllexport)
# else
#  define CLRLIBRARY_EXPORT __declspec(dllimport)
# endifnamespace LibCLRWapper {/*public ref*/ class CLRLIBRARY_EXPORT CLRClass{public:CLRClass();std::string InvokeMyAlgo(double arg1, double arg2, const char* arg3, double& oArg1, char** oArg2);};
}

此工程需要在预处理中加入导出宏,以及添加“引用”第3步建立的C#库

using *.dll的目录可以写绝对路径或者相对路径,否则可能找不到

6、QT工程,带界面,点击按钮执行

void QTinvokeCSMatlab::on_pushButton_invoke_clicked(void)
{qDebug() << "invoke start" << endl;if (m_clrclass){//std::string InvokeMyAlgo(double arg1, double arg2, char* arg3, double& oArg1, char** oArg2);double arg1 = 10;double arg2 = 20;QString arg3 = "Test";double oArg1 = 0;std::string oArg2 = "";char * oArg2_ = new char[128];memset(oArg2_, 0, 128);char arg3_[128] = { 0 };memset(arg3_, 0, 128);memcpy(arg3_, arg3.toLatin1(), arg3.length());//std::string outData = m_clrclass->InvokeMyAlgo(arg1, arg2, arg3.toStdString().c_str(), oArg1, &oArg2_);std::string o2(oArg2_);if (oArg2_){delete oArg2_;oArg2_ = nullptr;}qDebug() << "\n\nThis is  QT:";qDebug() << "oArg1 = " << QString::number(oArg1);qDebug() << "oArg2 = " << o2.c_str() << endl;qDebug() << "outData = " << outData.c_str();}qDebug() << "invoke over" << endl;QMessageBox::information(this, QString("Info"), QString("Over"));
}

到此,代码已经全部完成。

其中CLR既可以使用C#的语法也可以使用C++语法,只是new的表示方法有点区别,主要还是要注意输入输出的变量,以及不同语言之间的编码问题,可能会使得结果不正确或者乱码,至少我写的例子中不会出现,默认就好了。
执行结果:

Qt调用Matlab库C#库dll调用C++调用C#库CSharp库lib invoke matlab library .net donet netframework相关推荐

  1. matlab将cpp编译为dll,Matlab函数编译成dll供Cpp调用的方法图解教程

    曾经实现过将matlab函数编译成dll供Cpp调用,这篇文章的目的是对新增的面向对象的的扩展mwArray进行讲解,matlab很容易和C/C++联合起来使用. 以前做过matlab7与c++的混合 ...

  2. Matlab函数封装为DLL供Cpp调用

    Matlab函数封装为DLL供Cpp调用 文章目录 Matlab函数封装为DLL供Cpp调用 Ⅰ目标 Ⅱ 学习 Ⅲ 实现 1. Matlab 函数封装为DLL 2. vs2015中C++调用Matla ...

  3. 【转】matlab函数编译成dll供Cpp调用的方法

    转自:https://www.cnblogs.com/vincenzo/archive/2009/09/09/1563467.html 以前做过matlab7与c++的混合编程:将m函数编译成dll给 ...

  4. c 调用c语言写的dll文件路径,手把手教你用C/C++语言创建及调试动态库DLL程序

    引子 动态链接库DLL文件不仅可以实现代码.资源和数据的共享,同时也可以对源代码起保护作用,对于开发者来讲,DLL的生成及调试是程序员必须掌握的一种技术,下面通过一个具体的例子,演示使用C/C++语言 ...

  5. VS2019 MFC DLL共享动态链接库(MFC 常规库)封装例程非模态调用 MFC 常规库[二]

    [ 前言]          网上用很多关于MFC 共享DLL的简介,此处不在叙述.实际应用中发现"共享MFC DLL的规则DLL"是在编写基于MFC的DLL程序时,编译后该DLL ...

  6. qt调用c语言编写的dll文件,Qt之调用外部DLL - moki_oschina的个人空间 - OSCHINA - 中文开源技术交流社区...

    预备知识: 1.如果在没有导入库文件(.lib),而只有头文件(.h)与动态链接库(.dll)时,我们才需要显示调用,如果这三个文件都全的话,我们就可以使用简单方便的隐式调用. 2.通常Windows ...

  7. 包含目录、库目录、附加包含目录、附加库目录、附加依赖项如何使用? 及静态库,动态库的创建与调用和vs里引用的使用

    引言:vs中怎么添加外部头文件? 如过直接在项目头文件处,添加一下,如下图: 否则,依然会报错,如下图: 有两种方法,来解决(你不在vs上的添加它也没事): (1) 直接把外部头文件复制过来,放在此项 ...

  8. QT调用Saleae C#生成的dll文件

    背景:设计开发PEPS的测试设备时,需要对manchester 等波形采集数据,实际使用时常出现波形解析不准确,设置参数多等原因导致数据采集出现问题.所以冒出个想法是否可以直接使用逻辑分析仪输出的数据 ...

  9. 【转】用Qt生成dll类库及调用方法

    转载:http://blog.sina.com.cn/s/blog_6a961ad40100kiey.html .NET2005: 空白工程新建DLL后,将DLL和LIB文件放入需要调用的" ...

最新文章

  1. 在RHEL4上安装subversion1.4.2
  2. opencv-python图像处理之轮廓算法
  3. How Vmware snapshots works
  4. 这个牛逼技术你可千万别学!
  5. 一步一步学Ruby(七):数学表达式
  6. T-SQL管理数据库对象
  7. 几个支持生成Python代码的UML工具
  8. h:commandButton
  9. 总结几种结构体初始化方法 (转)
  10. Reactive(2) 响应式流与制奶厂业务
  11. p2p - cdn传输技术杂谈
  12. myeclipse编写的html页面乱码问题
  13. aodv-uu 源码解读
  14. 施耐德 m340 编程手册_M251M340在自动化立体仓储的应用
  15. 56个免费资源网站,总有你想要的。
  16. 状态方程简约为能控能观型
  17. 毕业四年,我当初是如何走上编程这条路的!
  18. 演练 畅销书排行榜 1002 html
  19. 2004年11月网络工程师级试题
  20. 仿猫眼电影在线选座组件

热门文章

  1. 物联网组网技术比较 NB-IoT、LoRa、ZigBee、WiFi、蓝牙等
  2. vncserver密码修改
  3. Java经典三角形:杨辉三角
  4. 练习1(华为交换机忘记console口密码)
  5. android app启动失败,Android应用App启动白屏(黑屏)问题解决
  6. linux车牌识别,基于嵌入式Linux的电子车牌识别系统设计与实现
  7. KS值是衡量分类模型预测准确度的重要指标之一,它反映了模型预测结果与实际数据分布差异的程度。本文将介绍什么是KS值,如何计算以及在Python中如何实现。
  8. nodeJS+mysql+连接池——连接池的创建和使用
  9. php 复制文件夹并压缩到最小_【实用】PHP实现下载与压缩文件的一些方法的封装与整理...
  10. jenkins pipeline slave部署nacos负载均衡平滑升级