c# - C# 调用以 char ** 指针作为参数的 C API
问题描述
我正在使用 C# 开发一个桌面应用程序,它必须从 C++ dll 调用这些 API:
int send_message(void * handle, char * message, size_t len);
int recv_message(void * handle, char ** message, size_t * len, int timeout);
send_message
向服务器发送一些文本,从服务器recv_message
接收消息。
recv_message
分配一个缓冲区来保存数据,然后将指针传回给它的调用者。
在查阅了一些网络链接后,我已经设法send_message
从我的应用程序中调用 API,如下所示:
// import API from DLL
[DllImport("test.dll", CallingConvention = CallingConvention.Cdecl, EntryPoint = "send_message")]
extern static int send_message(IntPtr handle, string message, int len);
// invoke the API
public int SendMessage(string message)
{
return send_message(this.client, message, message.Length);
}
但我未能调用第二个 API,我卡在了char **
andsize_t *
参数上。
任何想法?
解决方案
这不是对原始问题的直接回答。这是一种解决方法。我仍然想知道原始问题的答案。它很痒。
受到评论的启发,我认为在 C# 端分配缓冲区并将其传递给 DLL 更合理。
这是添加到 DLL 的新 API。
int recv_message2(void * handle, char * message, size_t len, int timeout);
这是 C# 中的导入语句。
[DllImport("test.dll", CallingConvention = CallingConvention.Cdecl, EntryPoint = "recv_message2")]
extern static int recv_message2(IntPtr handle, IntPtr buffer, int len, int timeout);
在 C# 中调用它:
IntPtr buffer = Marshal.AllocHGlobal(1024);
int ret = recv_message2(this.client, buffer, 1024, timeout);
if (ret > 0)
{
byte[] myByteArray = new byte[ret];
Marshal.Copy(buffer, myByteArray, 0, ret);
return Encoding.UTF8.GetString(myByteArray);
}
希望能帮助到你。
推荐阅读
- python - 搜索结果不打印在网站上,只打印在命令行中
- grails - grails 插件是否在发布时编译
- python - print(type(a)) vs type(a) - 如何查看代码的结果
- html - initial-scale=1.0 是否会阻止放大网页?
- python - 如何从参数中获取每个参数中的多个单词(discord.py)
- android - 检查设备是否正在运行cordova
- r - 将百分比标签添加到条形上方的堆积条形图
- flask-restful - 一多参考 flask_restx Dto
- rest - 使用 rest 客户端 PUT 映射错误弹性搜索:无法解析映射 [_doc]:根映射定义具有不受支持的参数:
- flutter - Page transitions issue [Flutter]