Interopérabilité: Structure

Résolu
Tuizi Messages postés 144 Date d'inscription samedi 21 octobre 2000 Statut Membre Dernière intervention 7 mai 2009 - 18 avril 2007 à 11:06
Tuizi Messages postés 144 Date d'inscription samedi 21 octobre 2000 Statut Membre Dernière intervention 7 mai 2009 - 19 avril 2007 à 13:18
Bonjour,

Voila en C++ j'ai une DLL que j'utilise sans problème, et j'aimerai l'utiliser sur un programme C#, tout marche bien, les dllImport fonctionnent à merveille, mais je suis tomber sur une structure où ça coince:

typedef struct
{
    unsigned short  wHandleMsg;
    unsigned long   dwIdent; 
    tCanTypeId      eTypeId;    
    unsigned long   dwMask;    
    tCanService     eService;         
    unsigned long   lPeriod;            
    unsigned long   dwReserved1;        
    unsigned long   dwReserved2;       
    unsigned short  wDataLen;           
    unsigned char   bData[CAN_MAX_DATA];
} tCanMsg;

Que j'ai donc transformer en C# par:

public
struct
CanMsg
{

   public
UInt16 wHandleMsg; 
   p
ublic
UInt32 dwIdent; 

   public
CanTypeId eTypeId; 

   public
UInt32 dwMask; 

   public
CanService eService; 

   public
UInt32 lPeriod; 

   public
UInt32 dwReserved1; 

   public
UInt16 wDataLen; 

   public
byte[] bData;
};
Voyez vous une erreur? les CanTypeId et CanService sont de simple enum!

Car mon erreur vient du faite que le fonction qui utilise cette structure me dit qu'il y a une erreur de paramètre sur dwIdent

Tuizi

23 réponses

Tuizi Messages postés 144 Date d'inscription samedi 21 octobre 2000 Statut Membre Dernière intervention 7 mai 2009
18 avril 2007 à 21:58
40 octets avec le MarshalAs
36 octets sans.

Mais du coup maintenant vu que tout marche bien, limite je n'ai plus a m'en soucier. J'ai juste a créé un tableau de la taille des données. L'interet de cette déclaration en C++ c'est qu'il ne faut pas que la taille de ce tableau dépasse 8 et ça en C# je vois pas comment faire, sauf bien sur avec un if

Tuizi
0
Lutinore Messages postés 3246 Date d'inscription lundi 25 avril 2005 Statut Membre Dernière intervention 27 octobre 2012 41
19 avril 2007 à 02:30
Oui c'est limité à 8 bytes mais ça c'est la contrainte imposé par la définition en C++. Si c'est un paramètre en retour c'est inutile de l'allouer par contre si c'est un paramètre que tu dois remplir avant de le passer au code C++, effectivement dans ce cas faudra l'allouer avec new.. Je me souviens pas avoir testé mais logiquement le runtime devrait marshaller uniquement les 8 premiers bytes sans générer d'erreur même si le tableau est plus grand.

L'autre possibilité c'est le tableau de taille fixe.. mais là attention aucun test de dépassement de capacité n'est effectuer.

public unsafe struct CanMsg
{
 // ..
 public fixed byte bData[ CAN_MAX_DATA ];
}
 
0
Tuizi Messages postés 144 Date d'inscription samedi 21 octobre 2000 Statut Membre Dernière intervention 7 mai 2009
19 avril 2007 à 13:18
Oui c'est une structure que je complete pour la passer au code C++, donc c'est vraiment important de controlé la taille.
Non mais sinon pas grave je vais simplement faire une vérif sur la taille des données à traiter!

Tuizi
0
Rejoignez-nous