如何实现c++返回char**值传给C#
发表于:2026-11-01 作者:千家信息网编辑
千家信息网最后更新 2026年11月01日,本篇内容主要讲解"如何实现c++返回char**值传给C#",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"如何实现c++返回char**值传给C#"吧!ch
千家信息网最后更新 2026年11月01日如何实现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安全错误
数据库的锁怎样保障安全
精品咖啡豆
上海喔噻互联网科技有限公司
百单网互联网科技有限公司怎么样
科技与互联网
互联网金融公司科技
睿民互联网科技
火传媒上海互联网科技
郑州华宇互联网科技
互联网高科技企业
承德科技产业互联网发展
彤创互联网科技有限公司
宝灵互联网科技有限公司
千方科技属于互联网企业吗
青岛科技大学互联网大赛研究生
未来五年的互联网科技
电子科技大学互联网创业大赛
互联网在线教育科技创业
用友工业互联网科技发展
米泉互联网科技专业怎么样
保山浩联互联网科技有限公司
耶加雪菲
麻工互联网科技
金融科技与互联网金融相同和不同
中国航天科技大学国际工业互联网
健康食品互联网创新科技园项目
东莞新华互联网科技学校
滨湖区互联网智能科技产品有哪些
科技信息时代互联网发展
承德科技产业互联网平台
东风日产互联网科技公司叫什么