Với tuyên bố C API này, nó sẽ được nhập vào C# như thế nào?Làm thế nào để nhập khẩu void * C API vào C#?
int _stdcall z4ctyget(CITY_REC *, void *);
tôi đã có thể để có được điều này cho đến nay:
[DllImport(@"zip4_w32.dll",
CallingConvention = CallingConvention.StdCall,
EntryPoint = "z4ctygetSTD",
ExactSpelling = false)]
private extern static int z4ctygetSTD(ref CITY_REC args, void * ptr);
Đương nhiên trong C# là "void *" không biên dịch.
Một số Googling cho biết rằng nó phải được dịch là "đối tượng". Có vẻ như nó sẽ hoạt động. Nhưng những người khác chỉ ra rằng "Void * được gọi là một con trỏ hàm trong các thuật ngữ C/C++ trong thuật ngữ C# là một đại biểu". Điều đó không có ý nghĩa gì cả ở đây vì nó sẽ đại diện cho điều gì? Một số cuộc gọi tương tự cho các API khác được tìm thấy thông qua Googling sử dụng các chức năng khác trong API tương ứng. Nhưng trong API này, không có cuộc gọi nào khác có ý nghĩa.
Các tài liệu cho các cuộc gọi cho thấy một ví dụ:
z4ctyget(&city, “00000”);
Mà dường như để chứng minh rằng ngay cả một giá trị tĩnh có thể được thông qua.
Nó sẽ biên dịch với đối tượng thay cho khoảng trống *. Tôi không biết liệu điều này có đúng hay không và tôi chưa có cơ hội thử nghiệm nó (vấn đề cấp phép).
Tôi đoán là IntPtr –
Bạn định làm gì với con trỏ khi bạn đã có nó? Tôi cho rằng tất cả những gì bạn cần là cấu trúc CITY_REC, và bạn có ý định bỏ qua 'ptr'? –
@Erik - Vâng, tôi không chắc chắn. Các tài liệu có sẵn không rõ ràng về mục đích của param. –