c#调用C/C++ DLL,传入指针数组(指针指向自定的结构体)

2024-06-08 02:08

本文主要是介绍c#调用C/C++ DLL,传入指针数组(指针指向自定的结构体),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!


来源:http://bbs.csdn.net/topics/380165851


依靠以下文章:解决问题。


、、、、、、、、、、、、、、、、、、、、

可以用Marshal.StruectToPtr哦。


、、、、、、、、、、、、、、

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]public struct Query{public String Address;public Int32 Port;[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 32)]public String User;}public class LibWrap{//这里通过值传递指针数组,C++中不能改变数组大小//如需要此功能,可通过引用传递指针数组后再作处理(以IntPtr传递数组首地址)[DllImport("MyDll.dll")]public static extern void GetResult([In, Out] IntPtr[] array, Int32 size);}static void Main(string[] args){const int PointersCount = 11;    //指针数量IntPtr[] arrPointer = new IntPtr[PointersCount];//在C++中为每一个Query结构分配内存,并将指针赋入从C#传入的指针数组中LibWrap.GetResult(arrPointer, PointersCount);Query[] arrQuery = new Query[PointersCount];    //储存处理好的Queryfor (int i=0;i<PointersCount;i++){//arrQuery[i] = (Query)(Marshal.PtrToStructure(arrPointer[i], typeof(Query)));Marshal.PtrToStructure(arrPointer[i], arrQuery[i]);Console.WriteLine("Query{0}: Address {1}, Port {2}, User {3}", i, arrQuery[i].Address, arrQuery[i].Port, arrQuery[i].User);}Console.ReadKey();}


、、、、、、、、、、、、、、、、、、、、、、、

直接用IntPtr作为参数传入就可以了;

数组在内存中是顺序存储的,调用方法后IntPtr参数返回的是数组第一个值的地址;
所以,数组第N个元素的地址为IntPtr + N * sizeof(struct);
得到数组元素的地址后,用Marshal.PtrToStructure转化即可;








这篇关于c#调用C/C++ DLL,传入指针数组(指针指向自定的结构体)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1040946

相关文章

C++中unordered_set哈希集合的实现

《C++中unordered_set哈希集合的实现》std::unordered_set是C++标准库中的无序关联容器,基于哈希表实现,具有元素唯一性和无序性特点,本文就来详细的介绍一下unorder... 目录一、概述二、头文件与命名空间三、常用方法与示例1. 构造与析构2. 迭代器与遍历3. 容量相关4

C++中悬垂引用(Dangling Reference) 的实现

《C++中悬垂引用(DanglingReference)的实现》C++中的悬垂引用指引用绑定的对象被销毁后引用仍存在的情况,会导致访问无效内存,下面就来详细的介绍一下产生的原因以及如何避免,感兴趣... 目录悬垂引用的产生原因1. 引用绑定到局部变量,变量超出作用域后销毁2. 引用绑定到动态分配的对象,对象

一文解析C#中的StringSplitOptions枚举

《一文解析C#中的StringSplitOptions枚举》StringSplitOptions是C#中的一个枚举类型,用于控制string.Split()方法分割字符串时的行为,核心作用是处理分割后... 目录C#的StringSplitOptions枚举1.StringSplitOptions枚举的常用

Redis中Set结构使用过程与原理说明

《Redis中Set结构使用过程与原理说明》本文解析了RedisSet数据结构,涵盖其基本操作(如添加、查找)、集合运算(交并差)、底层实现(intset与hashtable自动切换机制)、典型应用场... 目录开篇:从购物车到Redis Set一、Redis Set的基本操作1.1 编程常用命令1.2 集

JavaScript对象转数组的三种方法实现

《JavaScript对象转数组的三种方法实现》本文介绍了在JavaScript中将对象转换为数组的三种实用方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友... 目录方法1:使用Object.keys()和Array.map()方法2:使用Object.entr

C#自动化实现检测并删除PDF文件中的空白页面

《C#自动化实现检测并删除PDF文件中的空白页面》PDF文档在日常工作和生活中扮演着重要的角色,本文将深入探讨如何使用C#编程语言,结合强大的PDF处理库,自动化地检测并删除PDF文件中的空白页面,感... 目录理解PDF空白页的定义与挑战引入Spire.PDF for .NET库核心实现:检测并删除空白页

C#利用Free Spire.XLS for .NET复制Excel工作表

《C#利用FreeSpire.XLSfor.NET复制Excel工作表》在日常的.NET开发中,我们经常需要操作Excel文件,本文将详细介绍C#如何使用FreeSpire.XLSfor.NET... 目录1. 环境准备2. 核心功能3. android示例代码3.1 在同一工作簿内复制工作表3.2 在不同

C#中通过Response.Headers设置自定义参数的代码示例

《C#中通过Response.Headers设置自定义参数的代码示例》:本文主要介绍C#中通过Response.Headers设置自定义响应头的方法,涵盖基础添加、安全校验、生产实践及调试技巧,强... 目录一、基础设置方法1. 直接添加自定义头2. 批量设置模式二、高级配置技巧1. 安全校验机制2. 类型

C++读写word文档(.docx)DuckX库的使用详解

《C++读写word文档(.docx)DuckX库的使用详解》DuckX是C++库,用于创建/编辑.docx文件,支持读取文档、添加段落/片段、编辑表格,解决中文乱码需更改编码方案,进阶功能含文本替换... 目录一、基本用法1. 读取文档3. 添加段落4. 添加片段3. 编辑表格二、进阶用法1. 文本替换2

MyBatis/MyBatis-Plus同事务循环调用存储过程获取主键重复问题分析及解决

《MyBatis/MyBatis-Plus同事务循环调用存储过程获取主键重复问题分析及解决》MyBatis默认开启一级缓存,同一事务中循环调用查询方法时会重复使用缓存数据,导致获取的序列主键值均为1,... 目录问题原因解决办法如果是存储过程总结问题myBATis有如下代码获取序列作为主键IdMappe