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++/CLI Discussion :

Utilisation d'une classe C++ dans une classe C#


Sujet :

C++/CLI

  1. #1
    Membre actif Avatar de Masmeta
    Homme Profil pro
    Ing. R&D informatique industrielle
    Inscrit en
    Mai 2006
    Messages
    472
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Ing. R&D informatique industrielle
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2006
    Messages : 472
    Points : 221
    Points
    221
    Par défaut Utilisation d'une classe C++ dans une classe C#
    Bonjour,

    J'ai besoin d'utiliser une classe réalisé en C++ dans un programme C#. Cette classe se trouvant dans une bibliothèque.
    Je pense faire un wrapper entre cette classe C++ et mon aplication en C#. Je pense utilisé une classe codé en C++/CLI qui fait l'interface entre le C++ natif et le C#
    Est ce que c'est une sage décision ? Où y a t il une solution plus simple et performante ?

    L'idée que j'ai, c'est qu'à travers la classe C++/CLI faire une conversion de donnée de l'un vers l'autre.

    Voici le code de ma classe C++ native

    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
    35
    36
    37
    38
     
     
    namespace App
    {
     
    class Tart
    {
    public:
     
        DLLEXP Tart ();
     
        DLLEXP Tart (const std::string& path) { read(path); }
     
        DLLEXP Tart (std::ifstream& ifs);
     
        DLLEXP Tart (const SvmDlibWrapper& orig);
     
        DLLEXP Tart& operator=(const Tart& orig);
     
        DLLEXP void save(const std::vector<std::vector<float> >& vectors, const std::vector<float> labels);
     
        DLLEXP void scorePerClass(const std::vector<float>& v, std::vector<std::pair<double, float>>* scores) const;
     
        DLLEXP double load(const std::vector<float>& v) const;
     
        DLLEXP void read(std::istream& is);
     
        DLLEXP void read(const std::string& path) { Readable::read(path); }
     
        DLLEXP void write(std::ostream& os) const;
     
        DLLEXP void write(const std::string& path) { Writable::write(path); }
     
     
     
    };
     
    }
    Voici le code pour ma classe C++/CLI

    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
     
     
    namespace App
    {
     
    class wTart
    {
    public:
     
        DLLEXP wTart();
     
        DLLEXP wTart (const std::string& path) { read(path); }
     
        //DLLEXP Tart& operator=(const Tart& orig);
     
        DLLEXP void save(const std::vector<std::vector<float> >& v, const std::vector<float> labels);
     
        DLLEXP void scorePerClass(const std::vector<float>& v, std::vector<std::pair<double, float>>* scores) ;
     
        DLLEXP double load(const std::vector<float>& v);
     
        DLLEXP void read(String^ path) ;
     
        DLLEXP void write(String^ path);
     
    private :
        app::Tart objTart;
    };
    }

    Comment puis je convertir le format de donnée des types suivant :
    • const std::vector<std::vector<float> >
    • const std::vector<float>
    • std::vector<std::pair<double, float>>*


    Je vous remercie pour votre aide
    "Nulla Tenaci Invia Est Via"
    Aux persévérants aucune route n'est interdite

  2. #2
    Membre éprouvé
    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2009
    Messages
    552
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mars 2009
    Messages : 552
    Points : 1 060
    Points
    1 060
    Par défaut
    Bonjour,

    Citation Envoyé par Masmeta Voir le message

    Comment puis je convertir le format de donnée des types suivant :
    • const std::vector<std::vector<float> >
    • const std::vector<float>
    • std::vector<std::pair<double, float>>*

    Je pense que tu prends le problème dans le mauvais sens : Quelle est l'interface que tu voudrais en CSharp?

    Après, tu trouveras comment bricoler pour appeler la classe C++ (tu convertiras tes objets CSharp en C++ et vis versa dans la classe d'adaptation C++ : dotnetToVectorOfVector/vectorOfVectorToDotnet...)

    Est ce que c'est une sage décision ? Où y a t il une solution plus simple et performante ?
    On a renoncé à cette approche sur du code assez facile à porter. Si ta classe fait justedes lectures/écritures, il y a des chances pour que ça soit plus simple de le refaire en CSharp que de faire le binding C++/CLI.

    De mémoire, on a eu des problèmes de déploiement (choix des versions DOTNET, nécessité d'installer les redistribuables visual studio, etc.)

    Après, nous n'avons pas testé les performances, mais je ne vois pas comment on peut se débarrasser des conversions dans tous les sens...

Discussions similaires

  1. Réponses: 3
    Dernier message: 02/04/2013, 09h31
  2. Réponses: 8
    Dernier message: 05/04/2011, 08h06
  3. Réponses: 6
    Dernier message: 13/11/2009, 16h06
  4. Réponses: 4
    Dernier message: 16/05/2006, 23h15
  5. Réponses: 11
    Dernier message: 06/12/2005, 08h23

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