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 :

appeler du code C++/CLI depuis du C++


Sujet :

C++/CLI

  1. #1
    Membre averti Avatar de xxiemeciel
    Inscrit en
    Juin 2005
    Messages
    371
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 371
    Points : 352
    Points
    352
    Par défaut appeler du code C++/CLI depuis du C++
    Bonjour,

    Je cherche un moyen d'appeler du code C++/CLI ( aussi appelé managed C++ ) depuis du code C++ natif ( unmanaged C++ )

    J'ai trouvé a beaucoup d'endroit la maniere de faire le passage du unmanaged C++ vers le managed C++ mais dans l'autre sens je n'ai rien trouvé.

    Est ce que quelqu'un aurait une piste a suivre SVP ?

    XXiemeciel
    XXiemeciel

  2. #2
    Rédacteur
    Avatar de nico-pyright(c)
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    6 414
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 6 414
    Points : 16 075
    Points
    16 075
    Par défaut
    j'imagine que le code C++/CLI dont tu parles est dans un assembly :

    plusieurs méthodes :

    - convertir ton projet C++ (natif) en C++/CLI avec l'option de compilation /clr et appeler simplement ton assembly

    - enregistrer ton assembly C++/CLI pour com interop et l'utiliser ensuite comme un objet COM classique depuis ton programme C++ natif

    - hoster la CLR dans ton application C++ native et utiliser ainsi ton assembly

    La plus simple étant bien sur (et de très loin !) la première solution

  3. #3
    Membre averti Avatar de xxiemeciel
    Inscrit en
    Juin 2005
    Messages
    371
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 371
    Points : 352
    Points
    352
    Par défaut
    je pense que je vais regarder du coté de la deuxieme réponse ( COM interop ) puisque je ne peux pas toucher au C++ natif, je dois juste implementer une classe supplementaire qui va etendre l'API existant.

    Merci
    XXiemeciel
    XXiemeciel

  4. #4
    Membre averti Avatar de xxiemeciel
    Inscrit en
    Juin 2005
    Messages
    371
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 371
    Points : 352
    Points
    352
    Par défaut
    pour ceux que ca interesse :

    http://msdn2.microsoft.com/en-us/library/ms973872.aspx

    XXiemeciel
    XXiemeciel

  5. #5
    Membre averti Avatar de xxiemeciel
    Inscrit en
    Juin 2005
    Messages
    371
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 371
    Points : 352
    Points
    352
    Par défaut
    a propos de COM interop y'aurais pas des exemples ou des tutoriaux quelquepart parceque j'y arrive vraiment pas.
    XXiemeciel

  6. #6
    Rédacteur
    Avatar de nico-pyright(c)
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    6 414
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 6 414
    Points : 16 075
    Points
    16 075
    Par défaut
    qu'est-ce que tu n'arrives pas à faire ?
    tu es en C++ natif ? ou avec les MFC ?

  7. #7
    Membre averti Avatar de xxiemeciel
    Inscrit en
    Juin 2005
    Messages
    371
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 371
    Points : 352
    Points
    352
    Par défaut
    je suis en C++ natif, je dois simplement appeler des functions d'une classe managé depuis du code non-managé.

    en gros ce que je veut faire c'est la chose suivante (en tres grossier puisque le code si dessous n'est evidemment pas valide) :

    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
     
    #pragma managed
     
    public ref class Managed
    {
    public:
          void f()
          {
              //dosomething
          }
    }
     
    ....
     
    #pragma unmanaged
     
    public class Unmanaged
    {
    public:
          void appelerManagedCode()
          {
                 Managed* poManaged = new Managed();
                 poManaged->f();
          }
    }
    XXiemeciel

  8. #8
    Rédacteur
    Avatar de nico-pyright(c)
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    6 414
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 6 414
    Points : 16 075
    Points
    16 075
    Par défaut
    pourquoi c'est dans des pragma unmanaged ? si tu compilais en /clr, tu pourrais mixer les deux

  9. #9
    Membre averti Avatar de xxiemeciel
    Inscrit en
    Juin 2005
    Messages
    371
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 371
    Points : 352
    Points
    352
    Par défaut
    ok je vais essayer.
    XXiemeciel

  10. #10
    Membre averti Avatar de xxiemeciel
    Inscrit en
    Juin 2005
    Messages
    371
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 371
    Points : 352
    Points
    352
    Par défaut
    j'ai l'erreur suivante qui apparait apres avoir enlever tout les pragma.

    error C3265: cannot declare a managed 'mpoCounter' in an unmanaged 'UnmanagedObject'
    1> may not declare a global or static variable, or a member of a native type that refers to objects in the gc heap
    XXiemeciel

  11. #11
    Membre averti Avatar de xxiemeciel
    Inscrit en
    Juin 2005
    Messages
    371
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 371
    Points : 352
    Points
    352
    Par défaut
    j'ai essaye de creer mon objet avec new a la place de gcnew pour avoir un * a la place d'un ^ mais ca fait une autre erreur.

    j'ai l'impression qu'il faut un truc special pour appeler du managed code dans du unmanaged mais je ne trouve d'exemple nulle part.
    XXiemeciel

  12. #12
    Rédacteur
    Avatar de nico-pyright(c)
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    6 414
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 6 414
    Points : 16 075
    Points
    16 075

  13. #13
    Membre averti Avatar de xxiemeciel
    Inscrit en
    Juin 2005
    Messages
    371
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 371
    Points : 352
    Points
    352
    Par défaut
    ca ne resoud pas vraiment mon probleme.

    je vais essayer de rentrer un peu plus dans les details. J'ai un API en C++ natif qui permet d'enregistrer des classes et d'executer certaines fonctions de ces classes a partir de macro ( system de rapport/compteur generique par exemple ). Chaque instance est stock/ en C++ natif et pret a servir via des interfaces.

    Cet API est fait de tel maniere qu'il permet d'enregistrer des classes en C++ mais aussi en Java (avec JNI) et python ( avec Boost). On m'a demande d'etendre les fonctionnalite a C++/CLI.

    La partie gerant le .NET vers le C++ est faite ( plutot facile avec le IJW ) mais la partie qui fait qu'une fonction C++/CLI puisse etre appelee depuis le code natif me pose probleme.
    XXiemeciel

  14. #14
    Rédacteur
    Avatar de nico-pyright(c)
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    6 414
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 6 414
    Points : 16 075
    Points
    16 075
    Par défaut
    je ne comprends pas trop pourquoi tu as besoin d'appeler ton wrapper c++/cli depuis du code natif vu que tu peux appeler directement tes apis
    mais sinon, com interop peut etre interessant

    faudra que j'écrive un exemple un jour

  15. #15
    Membre averti Avatar de xxiemeciel
    Inscrit en
    Juin 2005
    Messages
    371
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 371
    Points : 352
    Points
    352
    Par défaut
    d'apres ce que j'ai lu COM interop devrait me permettre de faire ce que je cherche. Mais a part des long articles decrivant en detail pourquoi ca marche je n'ai pas trouve un seul exemple

    sinon pour repondre a ta question, je dois appeler mon code C++/CLI depuis le code natif parceque nos libraries contiennent des algorithmes en C++ natif appelable depuis JAVA, PYTHON ou C++. lorsque tu appelles un algorithme (par exemple Toto depuis du code .NET) et que tu veux generer le rapport d'execution de cet algorithme.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    MonRapport^ rapport = gcnew MonRapport(); //classe C++/CLI
    rapport->RegisterInstance("RapportToto"); //enregistre l'instance de MonRapport dans l'API C++ natif
    Toto^ t = gcnew Toto();
    t->run(); //Appel le code natif de l'algotihme
    a l'interieur du code de Toto, la fonction run() (qui est en C++ natif) va appeler les macros de rapports par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    mcREPORT("Toto complete successfully") );
    cependant ce code est dans le C++ natif mais va appeler le code de l'instance MonRapport qui est un objet C++/CLI.

    Ainsi un developper .NET peut definir des objets entierement .NET pour gerer son systeme de rapport sans avoir a utiliser du code C++ natif. tout en utilisant en fait nos algorithmes qui eux sont en C++ natif.

    vu qu'on y arrive en JAVA et PYTHON je pense que ca doit etre faisable en C++/CLI
    XXiemeciel

  16. #16
    Membre expérimenté
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 354
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 354
    Points : 1 419
    Points
    1 419
    Par défaut
    2.Pourquoi passer au C++ managé ?
    La première question qui vient à l'esprit quand on programme depuis longtemps sous Windows, à travers l'API ou les MFC, est : " Pourquoi passer au C++.net ? ".

    * La première raison est bien sur de pouvoir accéder au framework.net de Microsoft. Il est impossible d'y accéder depuis du code non managé, il est donc primordial de passer au C++ managé.
    c'est ce qui me semblait, confirmé par le tutorial.
    Si tu trouves une reponse je suis preneur.
    passer par COM a la limite ?

  17. #17
    Membre averti Avatar de xxiemeciel
    Inscrit en
    Juin 2005
    Messages
    371
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 371
    Points : 352
    Points
    352
    Par défaut
    j'essaye de passer par COM depuis deux jours maintenant mais impossible de trouver des exemples clairement expliqués.

    je suis en train d'essayer de definir une librairie TLB avec des interfaces exposées avec [Guid] mais pour l'instant je n'ai pas eu de résultats.

    Mais c'est forcement possible a faire, si on arrive a appeler du JAVA depuis du C++ ca serait bien le comble qu'on puisse pas appeler du C++/CLI
    XXiemeciel

  18. #18
    Membre averti Avatar de xxiemeciel
    Inscrit en
    Juin 2005
    Messages
    371
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 371
    Points : 352
    Points
    352
    Par défaut
    je viens de trouver ce lien qui semble correspondre a ce que je cherche.

    http://support.microsoft.com/kb/828736

    je vous tiens au courant si ca donne quelquechose.
    XXiemeciel

  19. #19
    Membre averti Avatar de xxiemeciel
    Inscrit en
    Juin 2005
    Messages
    371
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 371
    Points : 352
    Points
    352
    Par défaut
    bon inutile de s'Embetter il existe une solution ultra simple que je regrette de pas avoir vu avant.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    #include <vcclr.h>
    
    ManagedObject^ obj = gcnew ManagedObject();
    gcroot<ManagedObject^>* poRoot = new gcroot<ManagedObject^>(obj);
    je peux passer mon pointeur gcroot a du code non managé et appeler les fonction managés de ManagedObject a partir de la depuis le code Natif.
    XXiemeciel

  20. #20
    Membre expérimenté
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 354
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 354
    Points : 1 419
    Points
    1 419
    Par défaut
    dans ce cas c'est quoi exactement le type du pointer ...
    c'est pas tres clair pour moi, par contre ton lien de ton post precedent me semble clair ...

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. [JNI] appel d'une méthode java depuis le code natif
    Par myryad dans le forum Entrée/Sortie
    Réponses: 3
    Dernier message: 19/05/2009, 11h23
  2. Appeler du code behind depuis un événement javascript :
    Par FredChautems dans le forum ASP.NET
    Réponses: 8
    Dernier message: 24/03/2008, 13h36
  3. Appeler du code behind depuis un événement javascript :
    Par FredChautems dans le forum Framework .NET
    Réponses: 0
    Dernier message: 20/03/2008, 12h59
  4. [Compilation] Appel d'une fonction C++ depuis du code C
    Par bladerunners dans le forum C++
    Réponses: 1
    Dernier message: 06/09/2006, 14h26
  5. [JS] Appeler du code C# depuis du code JS
    Par DontNet dans le forum ASP.NET
    Réponses: 3
    Dernier message: 05/05/2005, 19h00

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