如何将void * C API导入C#?
鉴于此C API声明如何将其导入C#?
int _stdcall z4ctyget(CITY_REC *, void *);
我已经能够做到这一点:
[DllImport(@"zip4_w32.dll", CallingConvention = CallingConvention.StdCall, EntryPoint = "z4ctygetSTD", ExactSpelling = false)] private extern static int z4ctygetSTD(ref CITY_REC args, void * ptr);
当然在C#中,“void *”无法编译。
一些谷歌搜索表明它应该被翻译为“对象”。 这似乎应该工作。 但其他人表示“Void *在C / C ++术语中被称为函数指针,在C#术语中是一个委托”。 在这里,这并不是很有意义,因为它会委托给谁? 通过Google搜索找到的其他API的类似调用使用相应API中的其他函数。 但是在这个API中没有其他调用是有意义的。
该调用的文档显示了一个示例:
z4ctyget(&city, “00000”);
这似乎表明甚至可以传递静态值。
它将使用object代替void *进行编译。 我不知道这是否正确,我没有机会对其进行测试(许可问题)。
对于void *参数,您可以使用IntPtr
[DllImport(@"zip4_w32.dll", CallingConvention = CallingConvention.StdCall, EntryPoint = "z4ctygetSTD", ExactSpelling = false)] private extern static int z4ctygetSTD(ref CITY_REC args, IntPtr ptr);
如果您将类标记为不安全,也可以使用void *。
这实际上取决于API在该参数中寻找的内容。
您可以添加IntPtr或Object *以获取过去的编译器,但在调用它时仍需要将正确的数据传递给它。
据我所知,z4ctyget的C声明是:
int z4ctyget(CITY_REC *cityrec, char *zipcode);
第二个参数是5个字符的ANSI字符串,表示要开始搜索的邮政编码或“00000”从文件的开头开始。 所以你的声明应该是:
[DllImport(@"zip4_w32.dll", CharSet = CharSet.Ansi)] private extern static int z4ctygetSTD(ref CITY_REC args, string zipcode);