IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C# Discussion :

Wrapper C -> C#: Les customs types


Sujet :

C#

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    45
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 45
    Par défaut Wrapper C -> C#: Les customs types
    Bonjour,

    Comm expliqué dans un post précédent, je suis entrain de faire un wrapper d'une lib C en C#.

    Je me pose une question concernant la conversion des "typedef" C.

    Exemple :

    Structure C :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    typedef struct
    {
     EntType    type;
     Pnt        end1;
     Pnt        end2;
    } Linedef, Clinedef;
    EntType est un enum, pas de pb de conversion avec lui.

    Mais Pnt est def comme ceci :
    La question étant, puis-je créer un type équivalent en C#, ou puis-je simplement utiliser "double" ?

    En C# :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
            [StructLayout(LayoutKind.Sequential)]
            public class Linedef
            {
                public EntType type;
                public double[] end1; // ???
                public double[] end2;
            } // Linedef, Clinedef;
            public class CLinedef : Linedef {};
    Voir, avec initialisation :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
            [StructLayout(LayoutKind.Sequential)]
            public class Linedef
            {
                public EntType type;
                public double[] end1 = new double[2]; // ???
                public double[] end2 = new double[2];
            } // Linedef, Clinedef;
            public class CLinedef : Linedef {};

    Quelle est la meilleurs méthode ?


    Merci !

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    45
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 45
    Par défaut Update
    Re-Bonjour,


    Au fur et à mesure que j'avance, je rencontre d'autres problèmes

    Info sur le contexte:
    Je veux wrapper une lib C vers C#.
    Je dispose coté C des headers et des .lib, mais pas du code.

    Je suis partie sur l'idée suivante, faire un projet DLL Windows (sous studio) puis mapper les fonctions dont j'ai besoin une par une coté c/cpp dans un premier temps. Grosso-modo je ne fait que redéfinir les fonctions afin de les exporté via ma dll à moi. ce projet inclus les headers de la lib et link les .lib.

    le code ressemble à ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    WRAP_API Error wSectionEntityAdd(Section section, Entdef *entity2d, int *r_ent_id)
    {
    	return SectionEntityAdd(section, entity2d, r_ent_id);
    }
    Voici un résumé du code à wrapper, les headers, puis un exemple d'utilisation.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
     
    // <headers de la lib> : déclaration
    typedef struct section_data *Section;
     
    typedef struct
    {
     EntType    type;
    } Entdef;
     
    typedef struct
    {
     EntType    type;
     Pnt        end1;
     Pnt        end2;
    } Linedef, Clinedef;
     
    extern Error Section2DAlloc (Section *p_2d_section);
    extern Error SectionEntityAdd (Section section, Entdef *entity2d, int *r_ent_id);
     
     
    // <exemple.c> : Exemple d'utilisation
    Error err; // Error est un enum
    Section section; // ci-dessus, à priori un pointeur
    Linedef line; // struct
     
    err = Section2DAlloc(&section); // adresse du pointeur
     
    line.type = LINE;
    line.end1[0] = 0.0;
    line.end1[1] = 0.0;
    line.end2[0] = 0.0;
    line.end2[1] = 5.0;
     
    err = SectionEntityAdd(section, (Entdef*)&line, &lt_line_id);

    Je n'arrive pas à écrire la bonne déclaration C# avec DllImport pour ces 2 fonctions:
    - extern Error Section2DAlloc (Section *p_2d_section);
    - extern Error SectionEntityAdd (Section section, Entdef *entity2d, int *r_ent_id);

    Pour la première j'ai un code qui marche:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    [DllImport(cssNativeDllFullPath, EntryPoint = "wSection2DAlloc")]
    public static extern Error Section2DAlloc(out IntPtr p_psSection);
     
    // usage
    IntPtr section;
    err = Section2DAlloc(out section);
    Mais je me retrouve (je pense) avec l'adresse d'un pointeur, et se n'est pas ce que veut la fonction suivante, je ne vois pas comment déref un IntPtr.


    Je suis ouverte à toutes idées ayant une bonne flexibilité grace au mapping, je peux réajuster certains types coté cpp si besoins.


    Je sais pas si ça va parler à grand monde, mais on sait jamais :p


    Merci !

    EDIT:
    Je viens de tomber sur PInvoke Interop Assistant, j'espère pouvoir avancer un peu avec !

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    45
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 45
    Par défaut Bonheur !
    Alors il faut le dire, PInvoke Interop Assistant c'est du bonheur en bar !

    PB 1 : résolu, l'assistant remplace par des double, va pour des double
    PB 2 : il fallait bien un type IntPtr, associé au mot clé "ref"

    j'ai carrément balancer par copier coller un fichier .h entier dans l'appli, il me l'a convertie nickel en 3 secondes !

    bref, encore une auto résolution pour bibi

  4. #4
    Membre éclairé
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juin 2005
    Messages
    700
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Juin 2005
    Messages : 700
    Par défaut
    Excelent merci du tuyau, je vais tester ce soft. C'est surtout sa partie c#-> qui m'interresse.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 10
    Dernier message: 08/04/2007, 20h17
  2. Probleme avec les "input type="image" "
    Par khokho dans le forum Balisage (X)HTML et validation W3C
    Réponses: 9
    Dernier message: 26/03/2006, 17h12
  3. IE et les input type=file
    Par bibendum dans le forum Balisage (X)HTML et validation W3C
    Réponses: 2
    Dernier message: 02/03/2006, 17h25
  4. [Java 5] Réflexion sur les énumérations type-safe
    Par rozwel dans le forum Langage
    Réponses: 5
    Dernier message: 04/12/2004, 20h34

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo