Как импортировать void * C API в C#?
учитывая это объявление API C, как оно будет импортировано в 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 *" не компилируется.
некоторые Googling указывает, что он должен быть переведен как "объект.- Что, похоже, должно сработать. Но другие указывают ,что"Void * называется указателем функции в терминах C/C++, который в терминах C# является делегатом". Это не имеет большого смысла здесь, как что бы это было делегировать? Некоторые аналогичные вызовы для других API, найденных через Googling, используют другие функции в соответствующем API. Но в этом API никакой другой вызов не будет иметь смысла.
документация для вызова показывает пример:
z4ctyget(&city, “00000”);
который, кажется, показывает, что даже статическое значение может быть передано.
он будет компилироваться с объектом вместо void *. Я не знаю, правильно ли это, и у меня не было возможности проверить это (проблема лицензирования).
3 ответов
для параметра 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*, чтобы пройти мимо компилятора, но вам все равно нужно будет передать ему правильные данные при вызове.
насколько я могу сказать, объявление C z4ctyget:
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);