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 :

Exécuter du code C# lu à l'exécution


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Mai 2009
    Messages
    48
    Détails du profil
    Informations personnelles :
    Âge : 31
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2009
    Messages : 48
    Par défaut Exécuter du code C# lu à l'exécution
    Bonjour,
    Je réalise actuellement le portage d'un jeu vidéo que j'avais programmé en Ruby, vers C# et Xna.
    La version Ruby possède un mécanisme qui permet de charger du code depuis un fichier, et d'en faire un éval à l'intérieur d'une méthode d'une instance (où ce code a accès au variables d'instances de l'objet etc...).

    Problème
    Le problème c'est que ce n'est apparemment pas possible (ou alors très compliqué) à faire en C#.
    Ce qu'il faudrait faire, en résumé, c'est exécuter du code, propre à une seule instance d'un objet, à l'intérieur de cette instance (donc ayant accès à toutes ces variables).

    Pistes
    J'ai fait de longues recherches sur le net afin d'essayer de trouver une solution. Voici ce que j'ai exploré (et qui n'a pas marché) :
    - C# parser : Le nom pourrait faire penser que c'est une solution, mais je n'ai trouvé aucune documentation ou explication le concernant. J'ai tout de même téléchargé et compilé les sources, mais je ne vois pas du tout comment on l'utilise.
    - Cet article, où il est fait question de compiler du code pendant l'exécution. Seul problème, on parle de compilation d'assemblys entiers...


    Y'a-t-il donc une solution à mon problème ?
    Merci de votre aide !

    Solutions
    Dans le but d'aider ceux qui auraient le même problème quoi moi, voici les solutions qui ont été données :

    - Utiliser le langage de script LUA.
    Un tutoriel ici : http://www.gulix.fr/blog/IMG/pdf/Lua.pdf

    - faire comme cela (pour mon cas) :

    Compile-time :
    - Ecriture des comportements des events d'un niveau dans un fichier.
    Chaque comportement sera caractérisé par un ID, identique à celui de l'Event correspondant.
    - Compilation des comportements :
    Assembly : path.du.niveau
    Comportements stockés dans des méthodes statiques de la classe correspondant à path du niveau (à moins qu'on puisse faire une même classe notée partial, mais je sais pas si ça fonctionne si on compile pas tout en un assembly), dans le namespace qui sera le même que celui des Events

    Run-time :
    - Premier chargement du niveau : chargement de l'assembly qui porte le nom du path du niveau (avec les slashs remplacés par des ".").
    - Initialisation de chaque Event : création des delegates de comportements (Delegates déclarés non statiques, et initialisés lors du chargement de données d'un event (et non pas forcément lors de la création de l'instance) => pas besoin de les stocker dans un dictionnaire à la limite, surtout que chacun est unique).
    - Quand nécessaire : exécution des delegates avec pour argument l'Event en question.

    Et ici un petit bout de code assez utile, provenant de DonQuiche :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    // Signature que devront avoir les méthodes
    delegate void Behaviour(IActor actor, IActorState state);
     
    // Code pour charger la méthode comportementale "rock014" au début du niveau
    Assembly asm = Assembly.LoadFrom(".\\customscripts.dll");
    Type type = asm.GetType("Scripting.CustomScripts");
    MethodInfo method = type.GetMethod("rock014", BindingFlags.Public | BindingFlags.Static);
    Behaviour behaviour = (Behaviour)Delegate.CreateDelegate(method, null, typeof(Behaviour));
     
    // On la stocke dans le dictionnaire des comportements
    behvioursDictionary["rock014"] = behaviour;
     
    // On pourrait appeler behaviour ainsi :
    behaviour(someActor, someActorState);

  2. #2
    Inactif  
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2007
    Messages
    6 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Janvier 2007
    Messages : 6 604
    Par défaut
    La deuxième solution (compilation dynamque) répond à cette problèmatique.

    L'unité minimale de compilation en .Net est l'assembly de toute manière; je ne comprends pas bien ce qui te pose problème pour ce cas là ?

    Mais ceci dit, tu peux t'interroger sur le besoin fonctionnel de chargement dynamique de code. Pour quelle raison veux tu faire cela ?

  3. #3
    Membre chevronné
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2005
    Messages
    482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Décembre 2005
    Messages : 482
    Par défaut
    Salut

    pour le code en clair laisse clairement tomber... le c# n'est ni du Ruby ni du VBS...

    si tu veux pouvoir changer des fonctionnalités sans avoir à recompiler à chaque fois soit :

    1) tu te crées ton propre langage de script (Gaaaaaa) que tu devras interpréter toi même (pourquoi pas... mais t'as pas fini) ou peut-être voir du coté de "LUA"

    2) tu peux toujours charger dynamiquement des DLL... mais déjà compilées

    3) tu demandes à tous les gens à qui tu veux refiler ton jeu de s'installer visual studio et XNA et de le recompiler à chaque fois qu'ils modifient le code. (<= Mouahaha ^^)

  4. #4
    Inactif  
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2007
    Messages
    6 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Janvier 2007
    Messages : 6 604
    Par défaut
    Citation Envoyé par Themacleod1980 Voir le message
    2) tu peux toujours charger dynamiquement des DLL... mais déjà compilées
    Si c'est pour changer des fonctionnalités, autant en effet introduire un concept de plug-in, car on ne voit pas bien l'avantage qu'il y aurait à livrer du code non compilé.

  5. #5
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Mai 2009
    Messages
    48
    Détails du profil
    Informations personnelles :
    Âge : 31
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2009
    Messages : 48
    Par défaut
    Merci de cette réponse si prompte

    La deuxième solution (compilation dynamque) répond à cette problèmatique.

    L'unité minimale de compilation en .Net est l'assembly de toute manière; je ne comprends pas bien ce qui te pose problème pour ce cas là ?

    Mais ceci dit, tu peux t'interroger sur le besoin fonctionnel de chargement dynamique de code. Pour quelle raison veux tu faire cela ?
    Bon, dans ce cas là je vais rentrer un peu plus dans les détails.

    Dans mon système de jeu (plateformes 2D), la Map contient des Event, qui sont des objets tels que des plateformes, ennemis, etc... interagissant entre eux et avec le joueur.

    L'éditeur que j'ai programmé permet d'insérer du code (pour l'instant Ruby) destiné à être exécuté à des moments spécifiques (Event à l'écran, contact Event/héros, contact Event/tir etc... : Voir Screenshot en pj).

    Les caractéristiques de ce code :
    • [LI]Ce code a besoin de références vers des variables internes à l'Event (au pire, je peux passer une référence vers l'Event pour accéder aux champs public ferait l'affaire).[/LI]
      [LI]Ce code n'est utilisé que pour une instance d'Event.[LI]

    Il faut que je précise que j'utilise un système de Pooling pour ces Events, donc que je ne crée pas de nouvelles instances pendant le jeu, même quand de nouveaux Events apparaissent à l'écran (ils sont déjà instanciés). Ce qui fait que compiler une classe pour chaque Event n'est pas possible (puisqu'il faudrait les instancier en jeu, et que je ne peux pas prévoir le nombre d'Event qui vont être ajoutés à la map).

    -> Compiler des assemblys entiers ne semble pas bon
    -> Je suis obligé de charger ce code dynamiquement.

    Ce que je voudrai, c'est créer une méthode dynamique par exemple, que je puisse lier à un objet, et dont le corps serait créé à partir de code source

    Edit :
    1) tu te crées ton propre langage de script (Gaaaaaa) que tu devras interpréter toi même (pourquoi pas... mais t'as pas fini) ou peut-être voir du coté de "LUA"
    Oui j'y ai pensé, sauf que ça me semble :
    - long à faire
    - gourmand en ressources

    2) tu peux toujours charger dynamiquement des DLL... mais déjà compilées
    Euh, au vu de ce que j'ai expliqué au dessus ça serait pas possible ^^"
    Pis, ça consommerai énormément de mémoire je pense non ?

    3) tu demandes à tous les gens à qui tu veux refiler ton jeu de s'installer visual studio et XNA et de le recompiler à chaque fois qu'ils modifient le code. (<= Mouahaha ^^)
    Bien sur
    Images attachées Images attachées  

  6. #6
    Inactif  
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2007
    Messages
    6 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Janvier 2007
    Messages : 6 604
    Par défaut
    Citation Envoyé par RPG-man Voir le message
    Ce que je voudrai, c'est créer une méthode dynamique par exemple, que je puisse lier à un objet, et dont le corps serait créé à partir de code source
    Ben c'est du plug-in, non ? je ne pense pas que les utilisateurs du jeu soient sensés coder eux même leurs "Event" non ?

    La problématique me parle assez peu (n'étant ni utilisateur ni développeur de jeux vidéos) mais je ne vois rien qui ne puisse se faire avec une interface de type plug-in adéquate.

  7. #7
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Mai 2009
    Messages
    48
    Détails du profil
    Informations personnelles :
    Âge : 31
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2009
    Messages : 48
    Par défaut
    Non, ce n'est pas vraiment du plug-in.
    Chaque plateforme, personnage, porte, etc.. comportera des lignes de code (en gros je code des objets qui ne seront pas compilés). Et des Events, il y en aura surement des millions dans tout le jeu.

    En gros ce que je voudrais faire (et c'est un peu de l'utopie surement), c'est utiliser C#, en quelque sorte, comme un langage de script.

    Par exemple, dans le code d'un event, onglet "Contact Héros" écrire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Player.damage(5);
    this.Dispose();
    C'est sur, s'il n'y avait que ça ça serait simple, mais je veux gérer tout ce qu'un langage de programmation peut gérer : boucles, accès aux objets, etc...

  8. #8
    Inactif  
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2007
    Messages
    6 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Janvier 2007
    Messages : 6 604
    Par défaut
    Citation Envoyé par RPG-man Voir le message
    Non, ce n'est pas vraiment du plug-in.
    Chaque plateforme, personnage, porte, etc.. comportera des lignes de code (en gros je code des objets qui ne seront pas compilés).
    MAIS QUEL INTERET A CE QU'iLS NE SOIENT PAS COMPILES ?

    Et des Events, il y en aura surement des millions dans tout le jeu.
    Euh, oui, et alors ?

    En gros ce que je voudrais faire (et c'est un peu de l'utopie surement), c'est utiliser C#, en quelque sorte, comme un langage de script.
    Mais quel interêt ?????

    C'est sur, s'il n'y avait que ça ça serait simple, mais je veux gérer tout ce qu'un langage de programmation peut gérer : boucles, accès aux objets, etc...
    Encore une fois, je ne vois pas du tout la finalité.

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

Discussions similaires

  1. Réponses: 44
    Dernier message: 02/08/2006, 17h12
  2. Erreur 3141 dans exécution de code
    Par zoom61 dans le forum Access
    Réponses: 13
    Dernier message: 23/03/2006, 18h31
  3. [RosASM] Tracer l'exécution du code
    Par aumeunier dans le forum x86 32-bits / 64-bits
    Réponses: 2
    Dernier message: 14/03/2006, 19h26
  4. Réponses: 3
    Dernier message: 20/04/2005, 13h30
  5. Réponses: 7
    Dernier message: 03/02/2005, 18h20

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