如何实现c++返回char**值传给C#
发表于:2025-11-08 作者:千家信息网编辑
千家信息网最后更新 2025年11月08日,本篇内容主要讲解"如何实现c++返回char**值传给C#",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"如何实现c++返回char**值传给C#"吧!ch
千家信息网最后更新 2025年11月08日如何实现c++返回char**值传给C#
本篇内容主要讲解"如何实现c++返回char**值传给C#",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"如何实现c++返回char**值传给C#"吧!
char **arr; int arrlen,arrcol;templatevoid make2DArray(T** &ptr, int rows, int cols){ //创建二维数组,先创建行指针 ptr = new T*[rows]; //再为每一行分配空间 for (int i = 0; i < rows; i++) { ptr[i] = new T[cols]; }}void alloc2D(){ arrlen = 3; arrcol = 2; arr = new char*[arrlen];//分配3个元素的数组空间,每个元素是char*指针元素 for (int i = 0; i <= arrlen; i++) { arr[i] = new char[arrcol*(i+1)+1]; //其实不同行可以长度不同 }}void* returnpptr(int* len) //C++分配内存,返回**给C# { alloc2D(); *len = 3; for (int i = 0; i < arrlen; i++) { for (int j = 0; j <= arrcol*(i + 1)+1; j++) { if (j == arrcol*(i + 1)+1) arr[i][j] = 0; else arr[i][j] = (char)(0x31 + i + j % 5); } } return arr;}
[DllImport("dllfordebugdemo.dll", EntryPoint = "returnpptr", CallingConvention = CallingConvention.Cdecl)] public static extern IntPtr returnpptr(ref int len); private void button7_Click(object sender, EventArgs e) { int len =0; IntPtr p = returnpptr(ref len); IntPtr[] ps = new IntPtr[len]; for(int i =0;i显示如下:
123
23456
3456734
如果C++返回的是int**,实验如下:
int** ppcol;int* p1;int reflen;void* returnpptrint(int* len){ reflen = 1; *len = reflen; arrcol = 2; p1 = &arrcol; if (ppcol == NULL) { ppcol = &p1; } return ppcol;}[DllImport("dllfordebugdemo.dll", EntryPoint = "returnpptrint", CallingConvention = CallingConvention.Cdecl)] public static extern IntPtr returnpptrint(ref int len);private void button7_Click(object sender, EventArgs e) { int len =0; IntPtr p = returnpptrint(ref len); IntPtr[] ps = new IntPtr[len]; int[] lens = new int[len]; for (int i = 0; i < len; i++) { ps[i] = Marshal.ReadIntPtr(p + Marshal.SizeOf(typeof(IntPtr)) * i); Marshal.Copy(ps[i],lens,0,1); Console.WriteLine("lens[i]=" + lens[i]); } }显示:
lens[i]=2
总结:
C#无法接收C++返回值的char**/int**,只能先强转为void*,然后在C#中public static extern IntPtr fun(...),实际使用时二级指针的行数,并且通过IntPtr[]数组和Marshal.ReadIntPtr(基址+偏址),再用Marshal.Copy或PtrToString...方式获取最终值。
到目前为止:三级指针不管是参数还是返回值形式,都不成功(估计还是以后有时间再做实验)。
上面统一以c# IntPtr接收C++的void*(实际是char**/int**强转而来),虽然实验成功,但换种思维方式,c++中还是char**/int** fun(...),而c#中以IntPtr fun(...)可不可以呢?
[DllImport("dllfordebugdemo.dll", EntryPoint = "returnpptr", CallingConvention = CallingConvention.Cdecl)] public static extern IntPtr returnpptr(ref int len);private void button7_Click(object sender, EventArgs e) { int len =0; IntPtr p = returnpptr(ref len); IntPtr[] ps = new IntPtr[len]; for (int i = 0; i < len; i++) { ps[i] = Marshal.ReadIntPtr(p + Marshal.SizeOf(typeof(IntPtr)) * i); Console.WriteLine(Marshal.PtrToStringAnsi(ps[i])); }}void** returnpptr(int* len) //C++分配内存,返回**给C#{ alloc2D(); *len = 3; for (int i = 0; i < arrlen; i++) { for (int j = 0; j <= arrcol*(i + 1)+1; j++) { if (j == arrcol*(i + 1)+1) arr[i][j] = 0; else arr[i][j] = (char)(0x31 + i + j % 5); } } return (void**)arr;}或者将返回值改为实际的char**:char** returnpptr(int* len) //C++分配内存,返回**给C#{ alloc2D(); *len = 3; for (int i = 0; i < arrlen; i++) { for (int j = 0; j <= arrcol*(i + 1)+1; j++) { if (j == arrcol*(i + 1)+1) arr[i][j] = 0; else arr[i][j] = (char)(0x31 + i + j % 5); } } return (arr;}C#中还是IntPtr returnpptr(ref int len),最终实验也是成功的。
到此,相信大家对"如何实现c++返回char**值传给C#"有了更深的了解,不妨来实际操作一番吧!这里是网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!
C#
分配
c++
实际
指针
还是
实验
成功
元素
内存
数组
C++
j++
内容
方式
空间
c#
学习
不同
实用
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
河北ios软件开发在线咨询
年公安机关网络安全执法检查
数据库系统语言
产品经理在软件开发中的作用
深圳软件开发需要学什么
钢铁之师2服务器
数据库点击次数用什么类型字符
江苏互联网软件开发
数据库如何加入图片
外码 数据库
云存储服务器在监控哪个位置
写在手抄报上的网络安全知识
数据库文件版本高
朱砂服务器
智慧校园软件开发合同
文件查询数据库
网络技术发展网络游戏盛行
怎么样搭建一个dns服务器
数据库如何设置主键约束名
连接数据库的身份验证
数据库工程师考试合格标准
青岛大学生网络安全
中小学生家庭与网络安全有感
数据库在ug
江苏互联网软件开发
乌鲁木齐软件开发分类
网络安全下定义
人间地狱怎么租服务器价格
app软件开发哪里有提供
mysql读取数据库