如何将void*C API导入C#?
鉴于此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
[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);