C#调用使用char **指针作为参数的C API

时间:2019-03-12 05:38:05

标签: c# c dll

我正在使用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分配了一个缓冲区来保存数据,然后将指针传递回其调用方。

参考了一些Web链接后,我已经设法从我的应用中调用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 **size_t *参数上。

有什么主意吗?

1 个答案:

答案 0 :(得分:0)

这不是原始问题的直接答案。这是一个解决方法。 我仍然想知道原始问题的答案。会发痒。


受评论的启发,我认为在C#端分配缓冲区并将其传递给DLL更合理。

这是添加到DLL中的新API。

getRandomNumberInRange

这是C#中的import语句。

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);

希望有帮助。