je les suivantes C-tête/Exemple de code:C# Marshalling C struct et fonction
fichier d'en-tête
struct category_info {
int id;
const char *name;
const char *description;
};
DLLEXPORT
void* xyz_categories_info(struct category_info **info, size_t *info_count);
Exemple C Snippet
struct category_info *catinfo;
size_t catcount;
size_t i;
int max_name_len = 0;
void *catmem = xyz_categories_info(&catinfo, &catcount)
Ce que je voudrais convertir en C# ...
Mon premier GUESS (et son une estimation) est:
[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 statique externe IntPtr xyz_categories_info ([Out] category_info cat, [Out] int catSize);
Mais il ne semble pas juste ..
Toutes les suggestions .. Une fois ce qui précède est déclarée correctement en C# .. Comment devrait-il être accessible en C#
category_info catinfo;
catmem = xyz_categories_info (sur catinfo, sur le dénombrement);
??????
Toute aide grandement appréciée.
Merci
========================================= =======================================
Update 2
Le la mémoire allouée à xyz_categories_info est libéré en utilisant cet appel C:
void xyz_categories_info_free(void *p);
Voici un exemple de celui-ci étant utilisé en C .... Espérons que cela explique un peu plus ..
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);
Que fait exactement xyz_categories_info? En regardant son prototype, je peux deviner qu'il alloue un tableau de structures category_info et place un pointeur sur ce tableau et sa taille sur le paramètre de sortie. Que retourne-t-il? Votre extrait de code C ne contient pas cette information. –
Veuillez publier un extrait de code C complet qui montre comment les informations renvoyées par cette fonction sont utilisées et validées. En utilisant des fonctions Marshal de bas niveau et le type IntPtr, nous pouvons écrire presque tout ce que C fait, bien qu'il soit vraiment beaucoup plus bête de le faire en C++/CLI. –
Est-ce que ça aide Alex? – user296191