我尝试用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语法并不熟悉,所以问题是什么?我的调用语法是否正确(理论上)?
答案 0 :(得分:0)
在C#中,long指定64位整数。你的C代码中的size_t是64位吗?如果不是,则应将PInvoke签名更改为使用int而不是long。
如果声明PInvoke签名返回一个字符串,则编组器会从返回的指针创建一个字符串,然后在指针上调用CoTaskMemFree。只有当指针最初使用CoTaskMemAlloc分配时,这才合适。如果本机端自己清理内存,则应该声明PInvoke返回一个IntPtr,然后可以使用Marshal.PtrToStringAnsi或等效的字符串创建一个字符串。