如何将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);