在C dll中调用方法失败

时间:2014-09-05 22:31:18

标签: c# dllimport

我尝试用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语法并不熟悉,所以问题是什么?我的调用语法是否正确(理论上)?

1 个答案:

答案 0 :(得分:0)

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

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