Как импортировать 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);