调用C dll中的方法失败

本文关键字:方法 失败 dll 调用 | 更新日期: 2023-09-27 18:20:47

我试图从C#调用一个用C编写的dll方法。

这是C方法:

char *c_ata(char * const c, const size_t c_len, const unsigned char * const b, const size_t b_len);

我试着这样称呼它。

[DllImport(EntryPoint = "c_ata", CallingConvention = CallingConvention.Cdecl)]
private static extern string cAta(byte[] c, long c_len, byte[] b, long b_len);

问题是,当我尝试运行或调试NUnit测试时,我没有得到任何错误。

我不是很熟悉C语法,所以问题是?我打电话的语法(理论上)正确吗?

调用C dll中的方法失败

在C#中,long指定一个64位整数。size_t在您的C代码中是64位的吗?如果没有,则应将PInvoke签名更改为使用int而不是long。

如果PInvoke签名被声明为返回字符串,则编组器会根据返回的指针创建一个字符串,然后在指针上调用CoTaskMemFree。只有当指针最初是用CoTaskMemAlloc分配的时候,这才合适。如果本机端自己清理内存,则应声明PInvoke返回IntPtr,然后可以使用Marshal.PtrToStringAnsi或等效程序生成字符串。