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 :

problème accès classe C++ depuis projet C# WPF [Débutant]


Sujet :

C#

  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2011
    Messages
    56
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2011
    Messages : 56
    Par défaut problème accès classe C++ depuis projet C# WPF
    Bonjour à tous,

    Dans le cadre de mes études, je dois créer une jeux en C# WPF (4.0) utilisant une IA en C++.

    J'essaye de récupérer une valeur depuis une méthode d'une classe de mon projet C++ et de l'afficher dans une méthode du projet C#.

    J'ai donc une méthode (C #) qui crée un objet du projet C++ :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    int valeur = 0;
    Test test = new Test();
    valeur = test.calculate();
    Console.WriteLine("Valeur test : " + valeur);
    J'ai créé un projet de bibliothèque de classes en C++ :

    header IA.h :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    // IA.h
     
    #pragma once
     
    using namespace System;
     
    namespace IA 
    {
        public ref class Test
        {
              public : int calculate();
        };
    }
    Code IA.cpp :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    // This is the main DLL file.
     
    #include "stdafx.h"
    #include "IA.h"
     
    namespace IA
    {
         int Test::calculate ()
        {
    	 return (2);
        }
    }
    J'ai ajouté la référence dans l'assembly de mon projet C# et la clause using dans le fichier utilisant l'objet Test.
    Quand je crée l'objet dans le code, le compilateur reconnu le type de l'objet.

    Lors du runtime, si je crée une instance de l'objet Test, je reçoit l'erreur suivante :

    BadImageFormatException - Could not load file or assembly 'IA, Version=1.0.4196.31687, Culture=neutral, PublicKeyToken=null' or one of its dependencies. An attempt was made to load a program with an incorrect format.
    J'ai essayé avec différent type de projet C++ et j'obtiens la même erreur. Quelqu'un aurait-il une idée ?

    Merci d'avance pour vos réponses

  2. #2
    Membre Expert
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    2 210
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 2 210
    Par défaut
    Salut,

    En effet comme tu le fais, tu ne pourras pas obtenir de résultat concluant. Il faut s'orienter vers le Marshalling pour faire tes conversions de c++ vers c#.

    Il y a sur ce forum un tutoriel qui aborde l’interopérabilité :
    http://nico-pyright.developpez.com/t...c2005/interop/

    Bonne lecture

  3. #3
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2011
    Messages
    56
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2011
    Messages : 56
    Par défaut
    Merci pour ta réponse

    Je me doutais bien qu'il devait s'agir d'un truc du genre

    Je vais jeter un coup d’œil, je te tiens au courant

  4. #4
    Membre éprouvé
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    99
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 99
    Par défaut
    Ca devrait fonctionner. Vérifie que tu compiles l'un et l'autre pour la même plateforme (x86, x64).

  5. #5
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2011
    Messages
    56
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2011
    Messages : 56
    Par défaut
    Citation Envoyé par binoo Voir le message
    Salut,

    En effet comme tu le fais, tu ne pourras pas obtenir de résultat concluant. Il faut s'orienter vers le Marshalling pour faire tes conversions de c++ vers c#.

    Il y a sur ce forum un tutoriel qui aborde l’interopérabilité :
    http://nico-pyright.developpez.com/t...c2005/interop/

    Bonne lecture
    J'ai essayé d'appliquer ce qui était expliquer sur le tuto, mais je me retrouve toujours avec la même erreur. J'ai aussi essayé avec les versions des projets qui sont fournies par le tuto. Ca ne change rien. Je commence à me demander si ça ne vient pas de mon visual studio ...

    Citation Envoyé par realpasso Voir le message
    Ca devrait fonctionner. Vérifie que tu compiles l'un et l'autre pour la même plateforme (x86, x64).
    Normalement je n'ai rien touché de ce côté là. Désolé pour la question, mais peux-tu me dire comment vérifier que je compile bien pour la même plateforme ?

    Edit: Je pense à quelque chose ... L'erreur ne pourrait-elle pas venir d'un mauvais choix de ma part du type de projet C++ ?

  6. #6
    Membre Expert
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    2 210
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 2 210
    Par défaut
    Citation Envoyé par bebedemon
    Normalement je n'ai rien touché de ce côté là. Désolé pour la question, mais peux-tu me dire comment vérifier que je compile bien pour la même plateforme ?
    En fait, sur ton projet C#, tu peux aller dans les Propriétés (clic droit sur ton projet puis Propriétés). Dans l'onglet "Générer", tu choisis pour la plateforme cible x86.

    Tu recompiles et là tout devrait tourner.

  7. #7
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2011
    Messages
    56
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2011
    Messages : 56
    Par défaut
    ça fonctionne !!!

    La plateforme cible était à "any CPU" et étant donné que je suis en X64, je suppose qu'il compilait pour celui-ci alors que mon projet en C++ était compilé en x86.

    Merci beaucoup pour ton aide.

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

Discussions similaires

  1. Problème accès à un objet depuis un SwingWorker
    Par mrboliboli dans le forum EDT/SwingWorker
    Réponses: 6
    Dernier message: 24/04/2015, 15h50
  2. Réponses: 2
    Dernier message: 14/08/2012, 19h51
  3. Problème accès Textbox depuis une classe enfant
    Par Moutmouth dans le forum C#
    Réponses: 1
    Dernier message: 31/01/2011, 12h34
  4. Réponses: 2
    Dernier message: 19/12/2006, 15h51
  5. [EJB2] Accès Interface locale depuis une classe métier.
    Par rigor dans le forum Java EE
    Réponses: 2
    Dernier message: 10/10/2006, 14h44

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