如何将void * C API导入C#?

时间:2009-02-06 19:21:21

标签: c# pinvoke dllimport

鉴于此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 *进行编译。我不知道这是否正确,我没有机会对其进行测试(许可问题)。

3 个答案:

答案 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);