2010-06-09 7 views
1

Je ne sais pas comment gérer cette structure dans Mono.Marquage d'une structure en C à C#

typedef struct rib_struct { 
    rib_used_t used; 
    rib_status_t status; 
    rib_role_t role; 
    uint8_t conf; 
    rib_dc_t *pending; 
    pthread_mutex_t mutex; 
    pthread_cond_t cond; 
    rib_f_t *props; 
} rib_t; 

Et par exemple, rib_dc_t est comme:

typedef struct rib_dc_struct { 
    uint16_t id; 
    uint8_t min_id; 
    uint8_t conf; 
    struct rib_dc_struct *next; 
} rib_dc_t; 

Je ne sais pas comment les structures marshall pthread. Et les pointeurs ... devrais-je utiliser IntPtr ou une structure gérée? Comment masquer le pointeur dans la dernière structure à la structure elle-même?

Merci à adanvaced

Répondre

1

Il ne vient pas beaucoup plus ickier que cela. Vous seriez obligé de déclarer également les structures pthread_mutex_t et pthread_cond_t. Pas génial, ce sont des détails de mise en œuvre que le code C# ne devrait pas avoir à s'inquiéter. Je vous recommande d'utiliser le [StructLayout (LayoutKind.Explicit)] afin que vous puissiez déclarer uniquement les membres dont le code C# a besoin. Vous devrez écrire un petit programme de test en C/C++ qui utilise offsetof() pour trouver les offsets des membres.

Les pointeurs doivent être déclarés comme IntPtr. Vous devez rassembler vous-même les valeurs pointées avec Marshal.PtrToStructure(). Je ne sais pas combien de cela est couvert par Mono.

0

Merci pour la réponse Hans. J'ai finalement réussi à éviter cette structure, donc pas de problème.

Il ne reste que quelques fonctions Je ne sais pas comment marshall.

int rib_init (rib_callbacks_t * cb, void * données);

rib_callbacks_t est une structure de délégués comme ceci:

[StructLayout(LayoutKind.Sequential)] 
    internal struct rib_callbacks_t 
    { 
     public NewDevConnectedCallback new_dev_connected; 
     public DevDisconnectedCallback dev_disconnected; 
     public DcConnectedCallback new_dc_connected; 
    } 

rib_feature_t * rib_register_feature (char * desc);

Je devrais retourner cette méthode comme IntPtr à unmarshall avec Marshall.IntPtrToStructure, ai-je tort?

rib_feature_t ** rib_register_many_features (uint16_t * dev_type, char ** desc, comptage int);

Celui-ci je ne sais pas comment marshall. ** Les deux me ont rompu :(

int rib_send (rib_dc_t * dc, const void * msg, size_t len). int rib_recv (rib_dc_t * dc, void * buf, size_t len);

Dans ceux-ci, j'ai utilisé [MarshalAs (UnmanagedType.LPArray)] octet [] buf/msg ... est-ce correct?

Cordialement