当前位置: 首页 > news >正文

C++调用C#方法(附踩坑点)

C++调用C#方法

  • 写在前面
    • 效果
    • 思路
    • 步骤
    • 可能的问题
  • 写在后面

写在前面

工作需要用C++调用C#写到代码,看来网上写的方法,自己也踩了一些坑,这里总结一下,我只试了CLR的方法。
主要参考了下面几篇博客
C++调用C#库简单例程(Lucky的outlook应该使用了这个技术
C++ 调用C#工程的 dll , 互相调用方法
C++调用C#的库

效果

这里用C++调用C#类的加法函数实现2+3,然后调用C#的Console.WriteLine打印
在这里插入图片描述

思路

C#生成DLL文件,C++调用C#的DLL

步骤

1、创建C# .NET Framework类库
注意是.NET Framework类库,不要创建错了
在这里插入图片描述
我命名为CSAdd
在这里插入图片描述
这里我们在CSAdd命名空间下写了一个Class1类。类中写两个函数,一个Add函数实现加法,一个Print函数调用Console.WriteLine
注意这个类在CSAdd命名空间下,所以后面的C++调用要先引用这个命名空间才能创建Class1类

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace CSAdd
{public class Class1{public int Add(int a,int b){return a + b;}public void Print(String str){Console.WriteLine(str);}}
}

2、创建CPP项目
创建控制台应用
在这里插入图片描述
我命名为CPPInvokeCSAdd
在这里插入图片描述
在高级中开启clr
在这里插入图片描述
C/C++ —>语言---->符合模式设为否
在这里插入图片描述
我们写个main函数直接运行
在这里插入图片描述
可以看到exe文件确实生成在了\x64\Debug目录下
在这里插入图片描述

3、修改C#DLL的生成路径

在C#项目中把输出路径改为c++项目exe的输出路径上,也就是上面的\x64\Debug路径
在这里插入图片描述生成DLL,可以看到我们的CSAdd.dll生成在了这个目录下。
注意C#的DLL一定要和C++生成的exe在同一个目录下
在这里插入图片描述

4、编写C++程序,调用C#的DLL
关键点:
(1)使用#using 引用C#的dll,因为C#的dll放在C++项目下所以用../x64/Debug/CSAdd.dll代替完整路径F:\C++\CPPInvokeCSAdd\x64\Debug,写完整路径也可以。
(2)使用using namespace引入dll中的命名空间CSAdd,这样才能调用Class1
同时我们还迎入了C#的System命名空间,这是因为我们要在C++中创建C#的String对象(在System命名空间下)作为Print函数的参数(因为Print函数是C#实现了,所以不支持C++的std::string)。
(3)使用gcnew创建C#对象
(4)用 类名^ 表示C#的对象,所以这里用Class1^ dll,而不是Class1 dll。在C++/CLI中这个^类似于C++中的指针,但是因为C#有虚拟机,所以Class1^ dll实际是虚拟机在管内存的分配与回收,而不想C++的指针那样new的东西需要自己回收。
(5)因为dll->Print是调用C#中的方法,所以Print参数类型String也必须C#类型,所以创建了String^ resultStr
(6)为什么resultInt变量能调用ToString()方法?因为resultInt的类型是C#的int不是C++的int(我有点疑惑,具体得看看CLI的语法),所以直接dll->Print(resultInt.ToString())也是可以的。

//使用#using引用C# DLL,而不是#include;
#using "../x64/Debug/CSAdd.dll" 
// 引入CSAdd、System的命名空间
using namespace CSAdd;
using namespace System;int main()
{Class1^ dll = gcnew Class1();//使用gcnew创建dll中的对象指针int resultInt = dll->Add(2, 3);//调用dll对象中的方法String^ resultStr = gcnew String(resultInt.ToString());dll->Print(resultStr);return 0;
}

运行
在这里插入图片描述
5、如果之后要修改C#的代码
因为前面设置了C#项目中DLL是直接生成在C++项目的目录下的,所以修改完C#代码后直接在C#项目中点击生成就行了,不用该C++代码。
如果C++中#using "../x64/Debug/CSAdd.dll"这行编译器提示出错,把这行删了重写一次就好了。

可能的问题

报错:未能加载文件
在这里插入图片描述
可能原因:C++生成的exe和C#生成的dll不在同一个目录下,一定要在同一个目录下
在这里插入图片描述
解决办法:
C++项目的常规->输出目录、链接器->输出文件、c#的dll生成目录都是同一目录
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

写在后面

初入职场,上班好累啊,呜呜呜。
在这里插入图片描述

相关文章:

C++调用C#方法(附踩坑点)

C调用C#方法 写在前面效果思路步骤可能的问题 写在后面 写在前面 工作需要用C调用C#写到代码,看来网上写的方法,自己也踩了一些坑,这里总结一下,我只试了CLR的方法。 主要参考了下面几篇博客 C调用C#库简单例程(Lucky…...

开源前端埋点监控插件Web-Tracing

Web-Tracing是一款专为前端项目设计的前端监控插件,它基于JavaScript设计,兼容跨平台使用,并提供了全方位的监控功能。 开源地址:https://gitee.com/junluoyu/web-tracing-analysis 以下是关于Web-Tracing的详细介绍:…...

智慧排水远程监测系统物联网解决方案

智慧排水监测系统是一种集成了现代信息技术、物联网技术、大数据分析及云计算能力的高效城市排水管理解决方案。该系统通过全面、实时地监控城市排水网络的运行状态,旨在预防内涝灾害,优化水资源管理,保障城市安全运行,促进可持续…...

【SVN(Subversion)是一个版本控制系统】

Question SVN所有命令 Answer SVN(Subversion)是一个版本控制系统,用于管理和跟踪文件和目录的更改。以下是一些常用的SVN命令: 检出(Checkout) svn checkout URL从版本库中检出一个工作副本。 更新&am…...

leetcode108.把升序数组转换成二叉搜索树

题目描述 [-10,-3,0,5,9] 转换成如下二叉搜索树: 解题的核心原理是:二叉搜索树的中序遍历结果是一个升序数组,所以根节点的数值,也位于数组的中部。 class Solution {public TreeNode sortedArrayToBST(int[] nums) {return h…...

用QTdesigner制作自己的双目标定软件

目录 1,设计布局软件界面 2,导出界面ui文件为python的.py文件 3,为界面添加对应的功能 4,导出为exe可执行文件 5,运行测试效果 5.1 双击启动 5.2 添加必要的参数 5.3 ,运行结果 效果展示 动手制作双…...

MySQL:基础巩固-DDL

一、对数据库的操作 1.查询所有数据库 SHOW DATABASES;2. 查询当前使用的数据库 SELECT DATABASE();3. 创建数据库 CREATE DATABASE IF NOT EXISTS test DEFAULT CHARSET utf8mb4 COLLATE utf8mb4_general_ci;4. 删除数据库 DROP DATABASE IF EXISTS test;5. 使用数据库 …...

翻译软件在医学中的应用

翻译软件在医学中的应用非常广泛,主要体现在以下几个方面: 患者沟通:翻译软件可以帮助医务人员与非母语患者进行有效沟通,确保患者能够准确表达自己的症状和需求,也使医生能够清晰地解释治疗方案和用药说明。这对提升…...

政务大数据解决方案(六)

政务大数据解决方案通过建立综合数据平台,将来自各政府部门的异构数据整合并进行深入分析,利用人工智能和机器学习技术实现智能化数据处理与预测,从而提升政府决策的科学性和实时响应能力。方案涵盖数据采集、存储、处理、分析与可视化&#…...

【MATLAB机器人系统工具箱】【manipulatorRRT规划器】属性和方法解析

启用了连接启发式(heuristic)后,双向快速扩展随机树(RRT)算法会在以下情况下忽略 MAXCONNECTIONDISTANCE 的限制:当两棵树(起始树和目标树)之间的节点距离足够接近时,算法…...

MySQL 多表连接(JOIN)

在数据库开发中,多表连接(JOIN)是一个非常重要的技术,它使得我们可以在查询中整合多个表的数据,进而实现更加复杂的数据操作。本文将深入探讨 MySQL 中的多表连接,帮助读者全面理解 JOIN 的基本概念、类型和…...

Opencv学习-直方图比较

由于图像的直方图表示图像像素灰度值的统计特性,因此可以通过两幅图像的直方图特性比较 两幅图像的相似程度。从一定程度上来讲,虽然两幅图像的直方图分布相似不代表两幅图像相似,但是两幅图像相似则两幅图像的直方图分布一定相似。例如&…...

一文入门:正则表达式基础

正则表达式简介 正则表达式(Regular Expression,简称regex或RE)是一种用于匹配字符串中字符组合的模式。它广泛应用于编程语言、文本编辑器和各种工具中,用于执行复杂的字符串搜索和替换任务。 为什么使用正则表达式&#xff1f…...

深入理解 `@DateTimeFormat` 和 `@JsonFormat` 注解

前言 在Java应用程序中,处理日期和时间是一个常见的需求。无论是从数据库读取还是通过API接收数据,正确的日期和时间格式都是确保应用正确运作的关键因素。本文将深入探讨两个常用的注解——DateTimeFormat和JsonFormat——以及它们如何帮助我们在Sprin…...

微服务架构设计中的常见的10种设计模式

微服务架构设计的概念 微服务架构(Microservices Architecture)是一种用于构建分布式系统的软件设计模式。它将大型应用程序拆分成一组小型、自治的服务,每个服务都运行在其独立的进程中,服务之间通过轻量级的通信机制&#xff08…...

stripe Element 如何使用

这里要准备好几个东西: 一个支付成功过后的回调 还有一个下单的接口 一旦进入这个下单界面,就要去调下单的接口的,用 post, 这个 接口你自己写,可以写在后端中,也可以放到 nextjs 的 api 中。 首先说的是这个下单…...

vue3动态引入图片不显示问题

方法1.(打包后动态引用的图片未被打包入工程中,webpack,vite) 1.图片放到public 目录会更省事,不管是开发环境还是生产环境,可以始终以根目录保持图片路径的一致. 假设: 静态文件目录:src/assets/images/ 我们的目标静态文件在 …...

【流媒体】RTMPDump—AMF编码

目录 1. AMF类型2. AMF编码2.1 AMF_Number (AMF_EncodeNumber)2.2 AMF_BOOLEAN (AMF_EncodeBoolean)2.3 AMF_STRING 和 AMF_LONG_STRING (AMF_EncodeString)2.3.1 AMF_EncodeInt162.3.2 AMF_EncodeInt32 2.4 AMF_OBJECT (AMF_Encode)2.4.1 AMF_EncodeInt24 2.5 AMF_ECMA_ARRAY …...

Mysql双主双从

双主双从 1.安装Mysql1.1 查看linux版本1.2 下载Mysql安装包1.3 上传并解压1.4 安装Mysql1.5 编辑端口号1.6 Mysql启动命令1.7 更新密码 2.搭建Mysql主从复制2.1 搭建Master主服务器2.1.1 修改mysql配置文件2.1.2 重启Mysql服务2.1.3 创建Slave用户, 并授权2.1.4 查看主服务器当…...

安卓主板_MTK联发科主板定制开发|PCBA定制开发

MTK联发科安卓主板,采用MT6762八核平台方案,支持谷歌Android 11.0系统,MT6762采用ARM八核A53内核芯片、主频高达2.0GHz,GPU采用ARM PowerVR GE8329650MHZ,支持主流19201080分辨率,支持硬解H.264&#xff0c…...

后进先出(LIFO)详解

LIFO 是 Last In, First Out 的缩写,中文译为后进先出。这是一种数据结构的工作原则,类似于一摞盘子或一叠书本: 最后放进去的元素最先出来 -想象往筒状容器里放盘子: (1)你放进的最后一个盘子&#xff08…...

【网络】每天掌握一个Linux命令 - iftop

在Linux系统中,iftop是网络管理的得力助手,能实时监控网络流量、连接情况等,帮助排查网络异常。接下来从多方面详细介绍它。 目录 【网络】每天掌握一个Linux命令 - iftop工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景…...

多模态2025:技术路线“神仙打架”,视频生成冲上云霄

文|魏琳华 编|王一粟 一场大会,聚集了中国多模态大模型的“半壁江山”。 智源大会2025为期两天的论坛中,汇集了学界、创业公司和大厂等三方的热门选手,关于多模态的集中讨论达到了前所未有的热度。其中,…...

【力扣数据库知识手册笔记】索引

索引 索引的优缺点 优点1. 通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性。2. 可以加快数据的检索速度(创建索引的主要原因)。3. 可以加速表和表之间的连接,实现数据的参考完整性。4. 可以在查询过程中,…...

JVM垃圾回收机制全解析

Java虚拟机(JVM)中的垃圾收集器(Garbage Collector,简称GC)是用于自动管理内存的机制。它负责识别和清除不再被程序使用的对象,从而释放内存空间,避免内存泄漏和内存溢出等问题。垃圾收集器在Ja…...

1.3 VSCode安装与环境配置

进入网址Visual Studio Code - Code Editing. Redefined下载.deb文件,然后打开终端,进入下载文件夹,键入命令 sudo dpkg -i code_1.100.3-1748872405_amd64.deb 在终端键入命令code即启动vscode 需要安装插件列表 1.Chinese简化 2.ros …...

python爬虫:Newspaper3k 的详细使用(好用的新闻网站文章抓取和解析的Python库)

更多内容请见: 爬虫和逆向教程-专栏介绍和目录 文章目录 一、Newspaper3k 概述1.1 Newspaper3k 介绍1.2 主要功能1.3 典型应用场景1.4 安装二、基本用法2.2 提取单篇文章的内容2.2 处理多篇文档三、高级选项3.1 自定义配置3.2 分析文章情感四、实战案例4.1 构建新闻摘要聚合器…...

涂鸦T5AI手搓语音、emoji、otto机器人从入门到实战

“🤖手搓TuyaAI语音指令 😍秒变表情包大师,让萌系Otto机器人🔥玩出智能新花样!开整!” 🤖 Otto机器人 → 直接点明主体 手搓TuyaAI语音 → 强调 自主编程/自定义 语音控制(TuyaAI…...

AI编程--插件对比分析:CodeRider、GitHub Copilot及其他

AI编程插件对比分析:CodeRider、GitHub Copilot及其他 随着人工智能技术的快速发展,AI编程插件已成为提升开发者生产力的重要工具。CodeRider和GitHub Copilot作为市场上的领先者,分别以其独特的特性和生态系统吸引了大量开发者。本文将从功…...

【C++从零实现Json-Rpc框架】第六弹 —— 服务端模块划分

一、项目背景回顾 前五弹完成了Json-Rpc协议解析、请求处理、客户端调用等基础模块搭建。 本弹重点聚焦于服务端的模块划分与架构设计,提升代码结构的可维护性与扩展性。 二、服务端模块设计目标 高内聚低耦合:各模块职责清晰,便于独立开发…...