我正在使用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 **
和size_t *
参数上。
任何的想法?
这不是原始问题的直接答案。这是一种解决方法。我仍然想知道原问题的答案。它痒。
受评论的启发,我认为在C#端分配缓冲区更合理,并将其传递给DLL。
这是添加到DLL的新API。
int recv_message2(void * handle, char * message, size_t len, int timeout);
这是C#中的import语句。
[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);
}
希望能帮助到你。