c# - 如何在C#中用指针调用C语言编码的dll

标签 c# c dll import

我想用C代码写的dll,但是C函数的接口(interface)有一个数组指针的参数。那么,如何在 C# 中将数组传递给这个 C 函数?

@param requestBuf 请求缓冲区

@param requestBufferSize 请求缓冲区大小

要调用的函数:

int WriteAnswer(unsigned char* requestBuf, unsigned int requestBufferSize)

我导入了这个dll,唯一的问题是:我不知道如何处理第一个参数,因为它需要一个缓冲区指针。

最佳答案

您应该在 C# 中为您的 C++ DLL 和函数创建一个包装器:

[DllImport("mydll", 
   CallingConvention = System.Runtime.InteropServices.CallingConvention.Cdecl ,
   CharSet = CharSet.Ansi)]
public static extern int WriteAnswer(IntPtr buffer, UInt32 bufferSize);

要从 C# 调用该函数,您应该分配一个“非托管缓冲区”,发送到 C++,然后在 C# 中将其转换回字符串:

IntPtr unmanagedBuffer = Marshal.AllocHGlobal(100);
// Your Unmanaged Call
WriteAnswer(unmanagedBbuffer, 100);
string yourString = Marshal.PtrToStringUni(unmanagedBuffer);
Marshal.FreeHGlobal(unmanagedBuffer);

了解 C++ 返回的字符串类型很重要 PtrToStringUni 表示 UTF16(每个字符 2 个字节)。根据字符串的类型,您可能需要不同的函数。

关于c# - 如何在C#中用指针调用C语言编码的dll,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25154793/

相关文章:

c# - 如何在 RazorEngine 中使用相同的 key 在更新的模板上运行编译?

c# - 如何在 azure 中设置 Web 应用程序的连接字符串?

c# - 使用 CSOM for Sharepoint Online 筛选 TaxonomyFieldType 字段

c - 指向二维结构数组 C 的指针

dll - AzureDevOps 错误找不到类型或命名空间名称 'MyNamespace'(是否缺少 using 指令或程序集引用?)

c# - 断开连接后,C#客户端/服务器套接字将无法再次连接

c - 为什么 printf 不使用科学记数法?

c - C语言函数之间的控制权交换

vba - 从 VBA/VBScript/Visual Basic Classic 调用 Java 库 (JAR)

c++ - 推荐的 C++ 库设计