У меня есть следующий пример заголовка C / кода:
Заголовочный файл
struct category_info {
int id;
const char *name;
const char *description;
};
DLLEXPORT
void* xyz_categories_info(struct category_info **info, size_t *info_count);
Пример C Фрагмент
struct category_info *catinfo;
size_t catcount;
size_t i;
int max_name_len = 0;
void *catmem = xyz_categories_info(&catinfo, &catcount)
Который я хотел бы преобразовать в c # ...
Моя первая догадка (и это предположение):
[StructLayout(LayoutKind.Sequential)]
public struct category_info
{
int id;
[MarshalAs(UnmanagedType.LPStr)]
StringBuilder name;
[MarshalAs(UnmanagedType.LPStr)]
StringBuilder description;
};
[DllImport ("mydll.dll", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)]
public static extern IntPtr xyz_categories_info ([Out] категория_info cat, [Out] int catSize);
Но это выглядит не так ..
Любые предложения .. После того, как вышеупомянутое правильно объявлено в C # .. Как к нему следует обращаться в C #
category_info catinfo;
catmem = xyz_categories_info (вне catinfo, вне catcount);
??????
Любая помощь с благодарностью.
Спасибо
=============================================== =================================
Обновление 2
Память, выделенная в xyz_categories_info, освобождается с помощью этого вызова C:
void xyz_categories_info_free(void *p);
Ниже приведен пример его использования в C .... Надеюсь, это объясняет это немного подробнее ...
category_buffer = xyz_categories_info(&category_info, &category_count);
if( !category_buffer )
{
// Failed Log a message and exit.
exit(1);
}
for(j=0; j<category_count; j++)
{
if( category_info[j].id == 0 )
continue;
printf("id: %d name: '%s' description: '%s'\n",
category_info[j].id,
category_info[j].name,
category_info[j].description
);
}
xyz_categories_info_free(category_buffer);