鉴于此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#术语中是一个委托”。在这里,这并不是很有意义,因为它会委托给谁?通过谷歌搜索找到的其他API的类似调用使用相应API中的其他函数。但是在这个API中,其他任何调用都没有意义。
电话会议的文档显示了一个例子:
z4ctyget(&city, “00000”);
这似乎表明即使是静态值也可以通过。
它将使用object代替void *进行编译。我不知道这是否正确,我没有机会对其进行测试(许可问题)。
答案 0 :(得分:14)
对于void *参数,您只需使用IntPtr
即可 [DllImport(@"zip4_w32.dll",
CallingConvention = CallingConvention.StdCall,
EntryPoint = "z4ctygetSTD",
ExactSpelling = false)]
private extern static int z4ctygetSTD(ref CITY_REC args, IntPtr ptr);
答案 1 :(得分:1)
如果您将班级标记为不安全,也可以使用void *。
这实际上取决于API在该参数中寻找的内容。
您可以添加IntPtr或Object *来获取编译器,但是在调用它时仍需要传递正确的数据。
答案 2 :(得分:0)
据我所知,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);