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 :

Passer un objet du C# a une Dll C++


Sujet :

C#

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2011
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2011
    Messages : 25
    Points : 15
    Points
    15
    Par défaut Passer un objet du C# a une Dll C++
    Bonjour
    Alors voila la question que je me pose est comment passé un objet créer en C# a une DLL C++. Une de mes tentatives:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    GcHandle handle= Gchandle.alloc(Objet);
    IntPtr obj= (IntPtr) handle1;
    Evidemment quand je passe le IntPtr à ma dll, je ne sais pas vraiment avec quelle type le recevoir (a part void*) et du coup je ne peut pas utiliser la classe C#. Alors ma question est y a-t-il un moyen de faire passer cette objet ? ou je dois recréer cette classe dans ma DLL C++?

  2. #2
    Membre confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2011
    Messages
    269
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2011
    Messages : 269
    Points : 460
    Points
    460
    Par défaut
    Bonjour,

    Il n'y pas moyen de passer des instances de classe C# à du C++ natif (non managé).
    Le code C++ serait incapable d'appeler les méthodes de la classe C#.

    Par contre, tu peux tres bien passer des structures (sans méthode):
    - Il faut déclarer une structure en C#
    - Il faut déclarer la même structure en C++ (dans un .h donc)
    - Il faut aligner les données pour que le marshaling fasse son travaille.

    Après pour le code de passage, tu peux effectivement utiliser des GCHandle et "pinned" l'instance de ta structure, et enfin passé le IntPtr au C++.
    voir l'exemple de la msdn

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2011
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2011
    Messages : 25
    Points : 15
    Points
    15
    Par défaut
    très bien. Mais si dans notre structure on utilise des objets du styles double [][][]. Le code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int size = System.Runtime.InteropServices.Marshal.SizeOf(Object);
    renvoie l'erreur suivante: Type ' <Nom du type>' ne peut pas être marshalé comme une structure non managée ; aucune taille ou un offset ne peut être calculée.
    J'ai essayé de le contourné avec la solution de Msdn avec ce code la:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int size = System.Runtime.InteropServices.Marshal.SizeOf((System.Type)type);
    Mais l'erreur persiste. L'objet en question doit contenir des variables spécifiques pour être correctement marshalé en C++?

  4. #4
    Membre confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2011
    Messages
    269
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2011
    Messages : 269
    Points : 460
    Points
    460
    Par défaut
    Si ma mémoire est bonne, il y a deux cas pour le marshalling de tableau :
    • La structure ne contient qu'un tableau, et il est positionné en fin structure
    • La structure contient plusieurs tableau, ou l'unique tableau n'est pas positionné en fin de structure

    Dans le premier cas, tu n'est pas obligé de spécifié la taille du tableau
    Dans le second cas, il faut spécifié la taille maximal du tableau. Petit subtilité dans ce cas, la position du tableau doit être un multiple de 4, même contrainte pour le membre suivant le tableau.

    Dans tous les cas, il faut indiqué comme faire le marshalling, à l'aide MarshalAs

Discussions similaires

  1. Passer le handle d'un tForm à une DLL
    Par belial96 dans le forum Langage
    Réponses: 1
    Dernier message: 21/04/2008, 11h09
  2. passer un objet en parametre d'une methode RMI
    Par Dryss51 dans le forum Entrée/Sortie
    Réponses: 1
    Dernier message: 22/02/2008, 02h10
  3. Passer un TStringList en paramètre dans une DLL
    Par bubulemaster dans le forum Débuter
    Réponses: 8
    Dernier message: 18/09/2007, 14h14
  4. Passer un objet en argument d'une servlet
    Par julien1311 dans le forum Servlets/JSP
    Réponses: 16
    Dernier message: 06/08/2007, 16h30
  5. Réponses: 4
    Dernier message: 20/06/2007, 17h34

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