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

news2024/9/20 22:55:22

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生成目录都是同一目录
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

写在后面

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2043940.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【BUU】[NewStarCTF 2023 公开赛道]Final -CP读取文件内容

漏洞检测 访问首页发现是ThinkPHP5 的站点 用工具扫描一下,发现存在ThinkPHP5.0.23 RCE漏洞 访问验证,写入shell 成功写入shell. 根目录发现flag,但是权限不足 提权获取flag 准备提权,这里一开始尝试了find,但是find权限不足 尝试采用cp命令,移动到web目录,发现访问还是…

MySQL InnoDB中一个update语句从执行到提交的全过程(3)

接上文MySQL InnoDB中一个update语句从执行到提交的全过程(2)-CSDN博客 目录 六、本地提交 怎样保证binlog和redo log的状态一致呢? MySQL 中的内部 XA 机制 宕机时不同状态的处理 物理落盘策略 七、主备复制 八、返回提交成功 总结一…

Windows 10/11和Linux双系统用户请勿安装最新更新 否则将无法启动

据蓝点网报道,Windows 10/11 最新累积更新存在已知问题,如果你同时安装了 Linux 双系统则会在更新后导致系统无法正常启动。 启动时会出现如下报错: Verifiying shim SBAT data failed: Security Policy Violation.Something has gone serio…

私域场景中的数字化营销秘诀

​在当今的商业世界,私域场景的营销变得愈发重要。今天咱们就来深入探讨一下私域场景中的几个关键营销手段。 一、会员管理与营销 企业一旦拥有完善的会员体系,数字化手段就能大放异彩。它可以助力企业对会员进行精细划分,深度了解会员的消费…

win11笔记本电脑 声音输出设置为扬声器 | 添加蓝牙设备 | win11环境变量设置

🥇 版权: 本文由【墨理学AI】原创首发、各位读者大大、敬请查阅、感谢三连 🎉 声明: 作为全网 AI 领域 干货最多的博主之一,❤️ 不负光阴不负卿 ❤️ 文章目录 win11笔记本电脑 声音输出设置为扬声器搜索设置,打开设置选择声音选…

AI安全-文生图

1 需求 2 接口 3 示例 大模型图像安全风险探析 - 先知社区 前言 文生图模型是一种新兴的人工智能技术,它通过对大规模文本数据的学习,能够生成逼真的图像。这种模型包含两个主要组件:一个文本编码器和一个图像生成器。 文本编码器接收文本输入,并将其转换为一种数字化的表示…

Idea开发代码注释规范

规范 类注释:每个类都应该有一个简短的注释,描述这个类的用途和主要功能。注释应该放在类的声明之前,使用JavaDoc格式。 /*** 这是一个示例类,用于演示如何编写类注释。*/ public class ExampleClass {// ... }方法注释&#xf…

【Oracle点滴积累】解决PrereqSession failed: RawInventory gets null OracleHomeInfo故障的方法

广告位招租! 知识无价,人有情,无偿分享知识,希望本条信息对你有用! 今天和大家分享在安装Oracle Critical Patch Update (Patch Number:33806138) 遇到PrereqSession failed: RawInventory gets null OracleHomeInfo故…

github官网在线通过vscode编辑器模式查看编辑代码

文章目录 背景步骤关于快捷键话外 背景 今天新发现的一个小玩意儿 步骤 在github项目主页(我尝试了无痕模式不行) 按键盘的.这个按键,就是m右边2个,然后就会打开这个网站 github.dev/xxx 首次进入的时候,会像首次…

IDEA系列(四):IDEA导入Maven工程项目并配置Tomcat启动

IDEA系列(四):IDEA导入Maven工程项目并配置Tomcat启动 前言 【本篇使用IDEA版本:大概2020版本,较早了,不过版本大体一致】【若需要码,请扫描关注编程D艺术,回复idea2024,获取码使你的IDEA更加方…

Arm-v8/v9虚拟化原理---aarch64_virtualization_guide

一、相关参考(请仅参考,任意一篇足矣) 1.https://www.cnblogs.com/LoyenWang/p/13584020.html 2.https://zhuanlan.zhihu.com/p/470045640 3.万字剖析 Armv8 架构虚拟化-腾讯云开发者社区-腾讯云 4.https://zhuanlan.zhihu.com/p/5290842…

Docker——常用命令

1.Docker是做什么的? Docker 是一个开源的应用容器引擎,它让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。它可以帮助我们下载应用镜像,创建并运行镜…

SSM宠物领养系统-计算机毕设定制-附项目源码(可白嫖)55139

目 录 摘要 1 绪论 1.1 意义 1.2国内外研究现状 1.3ssm框架 1.4Vue.js 主要功能 1.4论文结构与章节安排 2 2 宠物领养系统系统分析 2.1 可行性分析 2.2 系统流程分析 2.2.1 数据增加流程 2.2.2 数据修改流程 2.2.3数据删除流程 2.3 系统功能分析 2.3.1功能性分析…

泰坦尼克号 - 从灾难中学习机器学习/Titanic - Machine Learning from Disaster(kaggle竞赛)第一集(了解赛题)

此次目的: 准备出几期博客来记录我学习kaggle数据科学入门竞赛的过程,顺便也将其中所学习到的知识分享出来。这是第一集(了解赛题),后面还会更新更详尽的代码和讲解等。(所学主要的内容来自与b站大学恩师“…

从数据分析到智能生产:AI在工业中的应用与未来

导语 | 人工智能技术的迅猛发展,正在引领第四次工业革命悄然而至。尽管 AI 技术在工业领域的部署仍有诸多难题亟待解决,但这并不能阻挡历史趋势的车轮滚滚向前,AI 正在为工业领域带来新的变革。今天,我们特邀了上海腾展长融董事 &…

MybatisPlus使用指南

MybatisPlus 1. 快速入门1.1 入门案例1.2 常见注解1.3 常见配置 2. 核心功能2.1 条件构造器2.2 自定义SQL2.3 Service接口 3. 扩展功能3.1 代码生成3.2 静态工具3.3 逻辑删除 4. 插件功能4.1 分页插件4.2 通用分页实体 1. 快速入门 1.1 入门案例 步骤一:引入Mybat…

初阶数据结构排序之插入排序

排序01 插⼊排序 基本思想 直接插⼊排序是⼀种简单的插⼊排序法,其基本思想是:把待排序的记录按其关键码值的⼤⼩逐个插 ⼊到⼀个已经排好序的有序序列中,直到所有的记录插⼊完为⽌,得到⼀个新的有序序列 。 实际中我们玩扑克牌…

uniapp 日常业务 随便写写 源码

现成的组件 直接用 <template><view style"margin: 10rpx;"><view class"tea-header"><text class"tea-title">礼尚往来</text><view class"tea-view-all"><text>查看全部</text>&l…

Redis 如何实现高并发

Redis 如何实现高并发 1、架构概述2、读写分离的优势3、注意事项 &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收藏不迷路&#x1f496; Redis&#xff0c;作为一个高性能的键值对存储系统&#xff0c;通过其独特的设计和优化策略&#xff0c;能够有效地支持高并发…

关于TM611AWLCOR连续液位检测传感器的使用明细

1. 前言 本文只做软件协议相关的使用说明&#xff0c;对于硬件设计相关不做讨论。 本使用明细中涉及到的所有文档均来自诺泰官方技术支持并征得同意进行技术公开交流。其中涉及的代码均由我本人编写&#xff0c;仅供交流学习。 2. 数据手册 经由淘宝“青岛诺泰微电子有限公司”…