Importer une struct du C (avec char**) vers le C#

Signaler
Messages postés
17
Date d'inscription
mardi 6 mai 2003
Statut
Membre
Dernière intervention
28 janvier 2011
-
Messages postés
3246
Date d'inscription
lundi 25 avril 2005
Statut
Modérateur
Dernière intervention
27 octobre 2012
-
Bonjour,

J'ai une fonction C qui retourne une struct et je souhaite l'utiliser en C#

typedef struct strct_Err
{
int iErr;
int iMsgCount;
char* pstructMsg[2048];
} StructErr;

StructErr foo();

en C#: j'ai:

[StructLayout(LayoutKind.Sequential)]
public unsafe struct strct_Err
{
public int iErr;
public int iMsgCount;
IntPtr pstructMsg;
}

[DllImport(MY_DLL, CharSet = CharSet.Ansi)]
public static extern strct_Err foo();

Cela compile et mais cela crash a l'execution.

le probleme vient de l'import de la struct et particulierement de IntPtr pstructMsg;

Si je commente IntPtr pstructMsg; dans le C et C# cela fonctionne correctement

Qu'elle est bonne definition de cette struct en C# ?

Merci de votre aide

:)

3 réponses

Messages postés
2375
Date d'inscription
jeudi 12 juillet 2001
Statut
Modérateur
Dernière intervention
15 décembre 2018
22
Bonjour,
pstructMsg est un pointeur sur une chaine de caractère d'une certaine longueur (2048).

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
public unsafe struct strct_Err
{
public int iErr;
public int iMsgCount;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 2048)]
public string pstructMsg;
}

++
Messages postés
3246
Date d'inscription
lundi 25 avril 2005
Statut
Modérateur
Dernière intervention
27 octobre 2012
39
Salut, je vois plutôt un tableau de chaines et comme la fonction retourne la structure par valeur c'est pas évident de marshaller ça de manière élégante, pour que ça ne plante pas il faut créer coté C# une struct qui a la même taille que celle en C.
Messages postés
3246
Date d'inscription
lundi 25 avril 2005
Statut
Modérateur
Dernière intervention
27 octobre 2012
39
Je pense que ta définition C++ est fausse.