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 :

Utiliser classes C++ dans code C#.NET


Sujet :

C#

  1. #1
    Membre averti
    Inscrit en
    Mai 2009
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 16
    Par défaut Utiliser classes C++ dans code C#.NET
    Bonjour,

    Je dispose d'un ensemble de classes C++ (fichiers sources) et j'aurais voulu savoir comment utiliser ces classes dans du code C#.
    J'ai trouvé pas mal de choses notamment comment importer des DLLs et réutiliser des fonctions C mais rien concernant les classes C++.

    Merci par avance

  2. #2
    Membre confirmé
    Inscrit en
    Juin 2009
    Messages
    100
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 100
    Par défaut
    Salut,

    Je ne suis pas expert en c++ sous visual studio, mais je pense qu'il doit être possible de creer des libraires.
    J'ai vu que tu pouvais créer un projet de type "class library" sous visual studio en anglais donc je suppose que le nom français doit être "bibliothèque" ou "librairie". Tu importes tes classes dans ce projet et tu compiles. Ceci te donnera une dll que tu ajoutes via les références dans ton projet C#.
    C'est ce que je ferai, mais attention, je n'ai jamais essayé ca donc je ne suis pas sur que ca fonctionne... Enfin ca te fait toujours une piste à explorer

  3. #3
    Membre averti
    Inscrit en
    Mai 2009
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 16
    Par défaut
    Ouais c'est ce que je pensais faire aussi malheureusement quand je veux importer dans les références de mon projet C# il me répond que ce n'est pas un assembly ni un fichier COM valide.

  4. #4
    Membre confirmé
    Inscrit en
    Juin 2009
    Messages
    100
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 100
    Par défaut
    Arf, je pensais bien que cela risquait d'arriver :S
    Je ne peux malheureusement pas t'aider plus que ça... Il va falloir attendre le passage de quelqu'un de plus calé que moi désolé.

  5. #5
    Expert confirmé

    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Septembre 2006
    Messages
    3 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Septembre 2006
    Messages : 3 580
    Par défaut
    bonjour Charter

    Je vais te répondre de façon simple et précise

    Pour utiliser du code C++ dans une librairie, application .Net (C#, VB.Net, etc) tu as plusieurs possibilités

    1 - Faire de ta classe C++ un objet COM (c'est long, fastidieux et pas "si" simple que celà)

    2 - Créer des fonctions C qui appelle tes objets C++ ==> Vilain

    3 - Faire un Wrapper autour de tes classes C++. Le C++/CLI est le langage intermédiaire entre le .Net et le C++ natif. Ce langage (c'est du C++ avec quelques ajouts .Net) te permet en effet de mélanger classe Managée et classe non managée (je te laisse chercher sur le net si tu ne connais pas la différence entre les deux). Pour utiliser ton code C++ en .Net, tu vas donc devoir faire ce fameux wrapper. C'est quoi exactement ? une classe en C++ Managée qui possède un membre privé correspondant à ta classe C++ native et proposant des fonctions "mappant" tes appels

    Genre :

    void UnefonctionC++CLI()
    {
    return MonObjectC++->UnefonctionC++();
    }

    Et voilà, tu as ton wrapper

    Ainsi, dans ton projet C#, tu pourras référencer l'assembly faite, et créer des objets managés (C++/CLI) qui s'occuperont d'appeler les fonctions de la librairie C++...

    Si tu as 10 fonctions C++ que tu veux exposer, il te faudra faire 10 fonctions C++/CLI pour faire ce travail... Seul difficulté : La conversion de type entre C++ et C++/CLI. Il existe une page internet qui donne les correspondances pour faire celà, et on trouve facilement le code de conversion entre des string managés et des CString (MFC) ou des char*

    Voilà

  6. #6
    Membre averti
    Inscrit en
    Mai 2009
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 16
    Par défaut
    Merci pour cette réponse précise.

    J'aurais juste voulu une petite précision.

    J'ai une classe A qui hérite de la classe B.
    La classe A possède une fonction f1() qui utilise la fonction f2() de la classe B.
    Si je n'utilise directement que la fonction f1() dans mon code C# je n'ai pas besoin de faire de wrapper pour f2() ?

  7. #7
    Expert confirmé

    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Septembre 2006
    Messages
    3 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Septembre 2006
    Messages : 3 580
    Par défaut
    Pour l'histoire des fonctions f1, fx, tu as parfaitement bien compris

    Les fonctions créees dans la classe managée ne sont QUE les fonctions que tu souhaites appeler depuis l'extérieur. Les fonctions "propres" à tes classes natives et qui ne seraient pas utiles pour le code C# n'ont pas besoin d'être wrappées (ie: encapsulées)

    Faire un Wrapper, c'est très simple.. en dehors de l'aspect conversion de type qui est "un" poil chiant au début, mais une fois que l'on a compris le principe et qu'on a convertit les types utilisés au moins une fois, tout roule nickel chrome

    A préciser qu'à partir d'une classe Wrapper, on peut créer un Event pour que ta classe C++/CLI lève cet évènement (pratique parfois quand on sait que la notion d'event n'existe pas en C++ natif en dehors du recours aux mécanismes d'abonnements etc...)

  8. #8
    Membre averti
    Inscrit en
    Mai 2009
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 16
    Par défaut
    ouf...

    (les classes en questions il y en a 15, chacune a a peu près 30 méthodes...jme serais amusé à toute devoir les wrapper.)

    As-tu déjà essayé SWIG ? apparemment ça sert à automatiser ce processus.

  9. #9
    Expert confirmé

    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Septembre 2006
    Messages
    3 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Septembre 2006
    Messages : 3 580
    Par défaut
    ah non, je ne connaissais pas SWIG, mais celà semble "interessant"

    Si tu l'utilises, fait un retour dans cette discussion pour donner un avis dessus

  10. #10
    Membre averti
    Inscrit en
    Mai 2009
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 16
    Par défaut
    Et... ca marche pas...
    J'ai passé l'aprem à chercher parce que j'avais pas envie de poster pour rien mais la ça bloque sévère...

    J'ai fait :

    1° Un projet bibliothèque CLR dans visual studio dans lequel j'ai mis ma classe C++/CLI + les classes C++ de base que j'avais.

    ->On compile tout ça pour récup une belle dll

    2° J'importe la dll sans prob dans mon projet C#

    3° Ca compile

    4° Erreur au runtime -> vector subscript out of range

    5° Une idée ?

  11. #11
    Expert confirmé

    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Septembre 2006
    Messages
    3 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Septembre 2006
    Messages : 3 580
    Par défaut
    peut-etre un tableau ou un element de ta classe natif qui n'est pas créer par un new ou malloc ?

    Un dépassement dans l'index d'un élément d'un tableau peut-etre ?

    Sans avoir le code, je pourrais difficilement en dire plus

  12. #12
    Membre averti
    Inscrit en
    Mai 2009
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 16
    Par défaut
    Le code ne devrait (normalement) pas être en cause cette partie m'étant fournie.
    Surtout l'endroit où cela bug est étrange :

    1° D'abord
    2° Puis il parcourt le tableau pour l'initialiser
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for( i=0; i<1024; i++ )	{ EEData[i]  = 0x00; }
    La variable membre EEData est de type vector<UCHAR>.
    Ce serait pas un problème du au fait que mes classes utilisent STL?

  13. #13
    Membre averti
    Inscrit en
    Mai 2009
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 16
    Par défaut [Résolu]
    C'est bon j'ai trouvé pourquoi ça marchait pas !
    C'est parce que c'est du windows
    Nan plus sérieusement aucune idée j'ai recommencé la procédure exactement la même chose et ça marche donc c'est cool merci encore du coup de main

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

Discussions similaires

  1. Utiliser variable JSP dans code java de JSP
    Par mouss4rs dans le forum Servlets/JSP
    Réponses: 1
    Dernier message: 27/01/2012, 13h48
  2. Utilisation calendar/datepicker dans projet ASP.Net
    Par arngrimur dans le forum jQuery
    Réponses: 1
    Dernier message: 23/09/2011, 12h21
  3. Utiliser var javascript dans code html
    Par -yasmine- dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 16/07/2010, 15h25
  4. Importer ou Utiliser solver Excel dans appli vb.net
    Par akabis dans le forum VB.NET
    Réponses: 0
    Dernier message: 02/06/2009, 16h23
  5. probleme utilisation classe java dans jsp
    Par prosper76 dans le forum Servlets/JSP
    Réponses: 1
    Dernier message: 11/10/2006, 09h31

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