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

如何将void*C API导入C#?,c#,pinvoke,dllimport,C#,Pinvoke,Dllimport,鉴于此C API声明,如何将其导入C# 我已经走了这么远: [DllImport(@"zip4_w32.dll", CallingConvention = CallingConvention.StdCall, EntryPoint = "z4ctygetSTD", ExactSpelling = false)] private extern static int z4ctygetSTD(ref CITY_REC args, void

鉴于此C API声明,如何将其导入C#

我已经走了这么远:

   [DllImport(@"zip4_w32.dll",
        CallingConvention = CallingConvention.StdCall,
        EntryPoint = "z4ctygetSTD",
        ExactSpelling = false)]
    private extern static int z4ctygetSTD(ref CITY_REC args, void * ptr);
在C#中,“void*”自然不会编译

一些谷歌搜索表明它应该被翻译成“object”,这看起来应该是可行的。但也有人指出“Void*在C/C++术语中被称为函数指针,而在C#术语中则是委托”。这在这里没有太多意义,因为它将委托给什么?通过谷歌搜索找到的对其他API的一些类似调用使用各自API中的其他函数。但是在这个API中,没有其他调用是有意义的

调用的文档显示了一个示例:

z4ctyget(&city, “00000”);
这似乎表明即使是静态值也可以传递


它将用对象代替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);

该死的,杰瑞德,30秒!该死的,你真见鬼=P@Erick:)今天几乎没有速战速决的胜利,一旦拿到了指针,你打算怎么处理它?我想你所需要的只是城市结构,而你打算忽略“ptr”?@Erik——嗯,我不确定。可用的文档不清楚参数的用途。我显示的C声明直接来自USPS提供的.h文件。2007年的文档显示了我的声明。在任何情况下,“00000”示例显示预期的输入是字符串(几乎肯定是ANSI)。所以我的C#声明应该是你想要的。
[DllImport(@"zip4_w32.dll", CharSet = CharSet.Ansi)]
private extern static int z4ctygetSTD(ref CITY_REC args, string zipcode);