C# 接收C++ dll 可变长字节或者 字符指针 char*
2024-09-22 08:00:44
网络上查找到的几乎都是 需要提前固定知道 接收字符(字节)数据的大小的方式,现在的数据大小方式 不需要提前知道如下
思路:
1 .C++,返回变长 指针或者字节 的地址给C# 接收,同时返回 该地址的数据长度给C#。
2 .C# 通过C++ 返回的数据长度,创建接收数据的byte[] 长度。
3.C# 通过返回的地址 拷贝读取数据。
C++ 代码如下:
extern "C" __declspec(dllexport) char * GetFileByteArray(wchar_t * BinfilePath, wchar_t *BinfileName,int indexFile, int * length)
{ char *chBinfilePath= nullptr, *chBinfileName = nullptr;
wchar_tTranstoChar(BinfilePath, &chBinfilePath);
wchar_tTranstoChar(BinfileName, &chBinfileName); char a[] = "13345zh中文 hello";
//前提条件需要 返回变长的指针
int fileCount = sizeof(a); char *att = new char[fileCount];
memcpy(att, a, fileCount); *length = fileCount-1; // C#获得长度 free(chBinfilePath);
free(chBinfileName); return att;// C# 获得指针 }
C# 处理如下:
[DllImport("BASECORELIBRARY.dll", CharSet = CharSet.Unicode, CallingConvention = CallingConvention.StdCall)]
public static extern IntPtr GetFileByteArray(string BinfilePath, string BinfileName, int indexFile,ref int length); int length = ; IntPtr piBuf = InvokeDLL.GetFileByteArray(newFilePath, toBinName, , ref length); byte[] arrayBuf = new byte[length];
Marshal.Copy(piBuf,arrayBuf,, length); string st= Encoding.Default.GetString(arrayBuf);
Console.WriteLine(st);
输出结果: 13345zh中文 hello
最新文章
- Openfire用户密码加密解密
- .net平台下垃圾回收机制
- struts2--convention-plugin--零配置
- IT公司100题-tencent-打印所有高度为2的路径
- Android 之 2048 的游戏逻辑分析
- json-lib date对象转json ,加入自定义日期格式处理
- android 下载instagram动态中图片的demo
- C#、.NET和ASP.NET三者之间的区别
- 绘制数据图表的又一利器:C3.js
- 微软企业库DBBA的研究
- windows服务用脚本无法启动
- Go 并发随机打印1-n
- 【UML 建模】活动图介绍
- Redis Sentinel主从高可用方案
- springAOP之代理
- How to Reset VW Steering Assist 1S1909144P with OBDSTAR X300 DP
- ESP8266擦除工具完整安装
- 《Kubernetes权威指南》——网络原理
- js 正则判断字符串下划线的长度
- Myeclipse代码格式化