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

Langage C++ Discussion :

C++/C# Question d'architecture.


Sujet :

Langage C++

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 9
    Par défaut C++/C# Question d'architecture.
    Bonjour,

    J'ai une petite question sur la manière de faire les choses.

    En espérant ne pas me tromper de section mais étant donnée que je souhaite travailler en C++/C# je pense être au bonne endroit.


    Voici donc l'exposé de ma question:


    Je cherche à réaliser un "petit" projet qui comprend un jeu simple (C++) et un outil (C#) qui permettrait d'éditer ce jeu (niveau, son, ...) avec pour but de toucher un peu à l'inter-op entre C++ et C#.


    Dans un soucis de maintenance, je cherchais la meilleur manière d'aborder le projet et je suis arriver à cette ébauche d'architecture:

    C++ DLL:
    Le moteur (graphique/son) et le gameplay.

    C++ exe:
    Le jeu en lui même avec utilisation des DLL.

    C#:
    L'outil avec utilisation des DLL.


    Que pensez-vous de cela? Est-ce réalisable? Pratique ? Voyez-vous une meilleur manière d'aborder le projet ?

    Merci pour vos réponse!

  2. #2
    Membre actif

    Inscrit en
    Octobre 2010
    Messages
    50
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 50
    Par défaut
    Je travaille sur un projet très similaire. Ce n'est pas moi qui ai écrit le moteur donc il est dans une librairie séparée. Le tout est contrôlable par un exécutable C# à l'aide de P/Invoke. Le marshalling de C# à C++ et vice-versa est délicat et coûteux en termes de performances, alors il vaut mieux tout écrire dans le même langage, mais pour des motifs pédagogiques (ce qui est mon cas aussi) c'est intéressant en effet.

    Si tu as des questions il y a des chances que je puisse t'aider parce que c'est encore très frais dans ma mémoire (j'ai abstrait toute la communication inter-langage dans une classe alors je n'y touche plus, mais ce fut assez long de faire cette classe ).

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 9
    Par défaut Merci!
    Bonjour et merci,

    Citation Envoyé par Dr Dédé Voir le message
    (j'ai abstrait toute la communication inter-langage dans une classe alors je n'y touche plus, mais ce fut assez long de faire cette classe ).
    Tu parles d'une classe en C# qui récupérerait les méthodes requises?
    du type:

    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
    // Marshal.cs
    using System;
    using System.Runtime.InteropServices;
     
    class PlatformInvokeTest
    {
        [DllImport("msvcrt.dll")]
        public static extern int puts(
            [MarshalAs(UnmanagedType.LPStr)]
            string m);
        [DllImport("msvcrt.dll")]
        internal static extern int _flushall();
     
     
        public static void Main() 
        {
            puts("Hello World!");
            _flushall();
        }
    }
    (Merci MSDN)

    Merci en tout cas de ta proposition je garderais ca en tête en cas de futur pépin .

  4. #4
    Membre actif

    Inscrit en
    Octobre 2010
    Messages
    50
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 50
    Par défaut
    J'ai effectivement une classe avec uniquement les méthodes P/Invoke (public static extern). Mais je ne m'en sers pas directement. En gros, j'ai un buffer d'évènements C#, et je le passe périodiquement au C++, qui désérialise les objets et qui peut ainsi savoir ce que le C# lui a envoyé. Cela marche dans l'autre sens aussi, donc la communication est bi-directionelle (ce qui est impossible avec de simples appels de méthodes puisqu'on ne peut pas appeler du C# depuis C++).

    Cela a aussi l'avantage de minimiser le nombre d'appels entre C# et C++ car il y a un gros overhead relié à P/Invoke. Microsoft recommande de faire moins d'appels en passant plus de données à la fois et c'est exactement ça le principe ici.

  5. #5
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 470
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 470
    Par défaut
    donc la communication est bi-directionelle (ce qui est impossible avec de simples appels de méthodes puisqu'on ne peut pas appeler du C# depuis C++).

    CCW
    http://msdn.microsoft.com/en-us/library/f07c8z1c.aspx

  6. #6
    Membre actif

    Inscrit en
    Octobre 2010
    Messages
    50
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 50
    Par défaut
    À moins d'utiliser COM bien entendu. Quand j'ai vu le nombre d'étapes que ça représentait j'ai assez rapidement mis ça de côté, mais c'est peut-être une solution intéressante, qu'en penses-tu?

  7. #7
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 9
    Par défaut Merci bien!
    D'accord je pense avoir compris ta manière de faire Dr Dédé et merci bacelar je ne connaissais pas du tout la méthodes je vais jeter un œil dessus.

  8. #8
    Membre confirmé
    Inscrit en
    Octobre 2010
    Messages
    64
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 64
    Par défaut
    Quelque chose qui pourrait etre utile: P/Invoke Interop Assistant
    http://blogs.msdn.com/b/bclteam/arch...an-patten.aspx

    C'est un outil developpe par microsoft qui (si j'ai bien compris) genere automatiquement le wrapper a partir d'un code natif en c++

  9. #9
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 9
    Par défaut Ok!
    Merci bien !

  10. #10
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Si tu n'utilises pas COM, il reste quand même une solution: pour utiliser du C++ "de base" depuis C#, tu peux te faire une couche de compatibilité en C++/CLI (en gros, écrire des classes managées qui sont des wrappers des classes non-managées).

    Je résume donc les deux options:
    1. Avec COM:
      • DLL C++ COM
      • Exe C++ du jeu
      • Éditeur C#
    2. Sans COM:
      • DLL C++ normale
      • DLL de compatibilité en C++/CLI
      • Exe C++ du jeu
      • Éditeur C#
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  11. #11
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 9
    Par défaut Merci
    Bien pensé de résumer la chose!

    J'espère que le topic sera utile à d'autre en tout cas.

Discussions similaires

  1. Question sur Architecture d'un jeu vidéo 3D
    Par Polygon dans le forum Développement 2D, 3D et Jeux
    Réponses: 2
    Dernier message: 28/10/2007, 12h43
  2. [C# 2.0] Question d'architecture - code dynamique
    Par StormimOn dans le forum Framework .NET
    Réponses: 11
    Dernier message: 06/03/2007, 11h19
  3. [Création d'un moteur] Petite question d'architecture technologique
    Par ludovic85 dans le forum Décisions SGBD
    Réponses: 9
    Dernier message: 07/02/2007, 18h00
  4. [Architecture] Question d'architecture
    Par bourbaki2003 dans le forum Général Java
    Réponses: 3
    Dernier message: 11/07/2006, 10h38
  5. [JPanel] [GUI] question d'architecture
    Par _KB_ dans le forum AWT/Swing
    Réponses: 3
    Dernier message: 15/06/2006, 15h10

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