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

标签 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 分配一个缓冲区来保存数据,然后将指针传递回其调用者。

在查阅了一些网络链接后,我已经设法从我的应用程序中调用 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# 中的导入语句。

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

希望对您有所帮助。

关于C# 调用以 char ** 指针作为参数的 C API,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55114775/

相关文章:

c# - 处理 wpf 应用程序中任何未处理的点击事件

c# - Unity - 在没有 resolve() 的情况下解析

c - 以结构作为值的枚举?

c - 位域在结构中的位置

c - scanf 正在跳过扫描

java - 在 Java 中使用 ImageSearchDll.dll(来自 AutoIt)编辑 : JNA

c# - 从 Java 调用 C# dll

c# - 需要帮助从 C# 诊断 SQL Server 奇怪的查询超时

c# - Dotless - 无法使用 MVC Bundling 在单独的文件中引用更少的变量

c# - 在 Framework 4.6 项目中使用 .net core DLL