c#程序调用c++开发dll库

        最近算法组同事开发一个接口,如获取名称:

extern "C" __declspec(dllexport) void GetName(std::string& name);

        打包成 dll 库后,供我这边 c# 项目中调用如下:

[DllImport("Test.dll", EntryPoint = "GetName", ExactSpelling = false, CallingConvention = CallingConvention.Cdecl)]
public static extern void GetName(out StringBuilder name);// 获取名称
public static string GetName()
{StringBuilder name = new StringBuilder(256);GetName(out name);return name.ToString();
}

        正常情况下,并没有什么问题。但是如果连续两次调用 dll 库中方法,程序必报错,提示尝试读取或写入受保护的内存

        开始觉得是因为传参被修改导致,沟通后将名称通过函数返回值返回,避免参数修改。

extern "C" __declspec(dllexport) std::string GetName();

        对应的,项目中程序也调整为:

[DllImport("Test.dll", EntryPoint = "GetName", ExactSpelling = false, CallingConvention = CallingConvention.Cdecl)]
public static extern string GetName();// 获取名称
public static string GetName()
{string name = GetName();return name;
}

        运行后程序直接报错了,一番查询后大概率是因为 c# 中的 string 类型和 c++ 中的 std::string 类别不匹配导致。同时让同事改为返回 const char* 试试。即:

extern "C" __declspec(dllexport) const char* GetName();

        调用如下:

[DllImport("Test.dll", EntryPoint = "GetName", ExactSpelling = false, CallingConvention = CallingConvention.Cdecl)]
public static extern IntPtr GetName();public static string GetName()
{IntPtr ptr = GetName();string name = Marshal.PtrToStringAnsi(ptr);return name;
}

        至此,问题才得以解决。在正确返回信息的同时,即使连续调用也依然稳定可行。

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

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

相关文章

Google的工程师质量文化(code-review)(思考)

早在2005年时,谷歌也存在大量的手工测试工作。由于团队规模快速增长,业务系统越来越复杂,测试工程师忙得不可开交。而且,生产问题也不断出现,很多开发工程师天天处于“救火”状态。于是公司开始建立工程师质量文化&…

如何使用ChatGPT仿写一篇学术论文

点击下方▼▼▼▼链接直达AIPaperPass ! AIPaperPass - AI论文写作指导平台 目录 1.仿写的目的 2.根据专业方向搜集合适的文献 3.总结想要仿写的文献 4.使用ChatGPT一步一步仿写 5.书籍介绍 AIPaperPass智能论文写作平台 深入地阅读和分析你研究领域的相关文…

汽车IVI中控开发入门及进阶(十六):carplay认证

现在有些中控采用高通的芯片如8155、8295等,实现多屏互动等,但是也有一些车型走低成本方案,比如能够实现HiCar、CarLife或者苹果Apple的Carplay等能进行手机投屏就好了。 能实现CarPlay功能通过Carplay认证,也就成了一些必须的过程,国产车规级中控芯片里,开阳有一款ARK1…

PLC_博图系列☞P_TRIG:扫描 RLO 的信号上升沿

PLC_博图系列☞P_TRIG:扫描 RLO 的信号上升沿 文章目录 PLC_博图系列☞P_TRIG:扫描 RLO 的信号上升沿背景介绍P_TRIG: 扫描 RLO 的信号上升沿说明参数示例 关键字: PLC、 西门子、 博图、 Siemens 、 P_TRIG 背景介绍 这是一…

10.Godot Input与自定义单例的使用

单例 单例是一个可以在任何一个脚本中对其进行直接访问的对象,分为内置单例与自定义单例。每个单例都是独一无二的对象。内置单例不是节点,主要成员是各类 Server,开发者可以使用它们直接控制游戏程序的图形与音效等内容。此外,还…

02.Vue2.x Vue模版语法

文章目录 Vue模版语法 Vue模版语法 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta name"viewport" content"widthdevice-width, initial-scale1.0" /><title>模版语法<…

拖尾渲染器-Unity拖尾渲染器的使用

Unity拖尾渲染器是一种特效组件&#xff0c;用于在游戏中创建拖尾效果。它可以用于模拟物体的运动轨迹、增加动感和视觉效果。以下是Unity拖尾渲染器的使用方法&#xff1a; 添加拖尾渲染器组件&#xff1a;在Unity编辑器中&#xff0c;选中需要添加拖尾效果的游戏对象&#xf…

Linux命令 awk

一、简介 awk是一种编程语言&#xff0c;用于在linux/unix下对文本和数据进行处理。数据可以来自标准输入、一个或多个文件&#xff0c;或其它命令的输出。它支持用户自定义函数和动态正则表达式等先进功能&#xff0c;是linux/unix下的一个强大编程工具。它在命令行中使用&am…

【御控物联】 JavaScript JSON结构转换、JSON结构重构、JSON结构互换(0):章节引导篇

文章目录 一、目录二、结语三、技术资料 一、目录 JavaScript JSON结构转换&#xff08;1&#xff09;&#xff1a;对象To对象——键值互换JavaScript JSON结构转换&#xff08;2&#xff09;&#xff1a;对象To对象——属性重组JavaScript JSON结构转换&#xff08;3&#xf…

Stabble Diffusion 本地部署教程详解

引言 随着人工智能技术的快速发展&#xff0c;文本到图像&#xff08;Text-to-Image, T2I&#xff09;模型已经成为研究和应用的热点。其中&#xff0c;Stable Diffusion 是一款开源的 T2I 模型&#xff0c;以其出色的图像质量和生成能力而受到广泛关注10。然而&#xff0c;要…

实现Spring底层机制(阶段1—编写自己的Spring容器,扫描包,得到bean的Class对象)

环境搭建抛出问题 1.环境搭建 1.创建maven项目 2.导入依赖 <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.org/POM/4.0.0 http://maven.ap…

代码随想录第43天|1049.最后一块石头的重量II 494. 目标和

1049.最后一块石头的重量II 1049. 最后一块石头的重量 II - 力扣&#xff08;LeetCode&#xff09; 代码随想录 (programmercarl.com) 动态规划之背包问题&#xff0c;这个背包最多能装多少&#xff1f;LeetCode&#xff1a;1049.最后一块石头的重量II_哔哩哔哩_bilibili 有…

2024年5月软考高项冲刺复习攻略,稳过!

目前&#xff0c;软考的考试频次已经改为一年一次&#xff0c;这意味着考生的考试机会成本增加了&#xff0c;考试通过率也更加受到关注。 如果一个考生已经取得了中级证书&#xff0c;那么他在考取高级证书时会面对相对较低的难度。但是&#xff0c;如果直接选择考取高级证书…

AI-数学-高中-39空间向量-2空间向量法(法向量)

原作者视频&#xff1a;【空间向量】【一数辞典】2空间向量法&#xff08;重要&#xff09;_哔哩哔哩_bilibili 法向量&#xff08;高中阶段所有与面的关系&#xff0c;都可以通过法向量去证明和解答&#xff09;&#xff1a; 是空间解析几何的一个概念&#xff0c;垂直于平面…

京东商品详情数据采集API接口|附京东商品数据返回PHP多语言高并发

京东获得JD商品详情 API 返回值说明 item_get-获得JD商品详情 API测试 注册开通 jd.item_get 公共参数 名称类型必须描述keyString是调用key&#xff08;必须以GET方式拼接在URL中&#xff09;secretString是调用密钥api_nameString是API接口名称&#xff08;包括在请求地址…

函数的问题

1.静态变量的作用域是整个文件。✘ 静态变量的作用域是局部作用域&#xff0c;但是其生存期是整个程序运行期间&#xff0c;而不是仅在函数调用时。静态变量在函数内部使用static关键字声明&#xff0c;可以保留其值&#xff0c;在函数调用结束后仍然存在。静态变量的作用域是…

ACM生涯总结

大一时迷恋上了算法竞赛&#xff0c;抓紧一切课余时间进行训练&#xff0c;也顺利了进入了学校的ACM-ICPC集训队。 大二以为能够拿到银牌&#xff0c;但命运和我开了个玩笑&#xff0c;连续两次拿到铜首&#xff08;一次差一名&#xff0c;一次差两名&#xff09;。 大三上的…

AI时代,操作系统交互的革命性变革

AI时代对操作系统交互的影响 对于2024年的智能手机厂商们来说&#xff0c;在冲击高端市场的路上有一场绝对输不起的硬仗&#xff0c;那就是AI大模型的落地之战。 OpenAI的ChatGPT引爆了全球AIGC&#xff08;生成式人工智能&#xff09;热潮&#xff0c;短短一年时间里&#xff…

新手小白,在数学建模的过程中应该怎么分工?

大家知道&#xff0c;数学建模竞赛是需要一个团队的三个人在三天或四天的时间内&#xff0c;完成模型建立&#xff0c;编程实现和论文写作的任务&#xff0c;对许多第一次参加建模或者建模经验比较欠缺的团队来说&#xff0c;是时间紧任务重的&#xff0c;那么怎么办呢&#xf…

Java学习笔记26(枚举和注解)

1.枚举和注解 1.1 枚举 ​ 1.枚举(enumeration) ​ 2.枚举是一组常量的集合 ​ 3.枚举属于一种特殊的类&#xff0c;里面只包含一组有限的特定的对象 1.枚举应用案例 ​ 1.不需要提供setXxx方法&#xff0c;因为枚举对象值通常为只读 ​ 2.对枚举对象/属性使用final st…