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#

  1. #41
    Membre à l'essai
    Profil pro
    Étudiant
    Inscrit en
    Mai 2009
    Messages
    48
    Détails du profil
    Informations personnelles :
    Âge : 30
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2009
    Messages : 48
    Points : 23
    Points
    23
    Par défaut
    Bon finalement ce n'est pas totalement fini. J'essaye depuis hier de faire fonctionner les méthodes créées, ça ne marche manifestement pas.
    Pour donner quelques informations :
    - La compilation du code marche bien : si y'a des erreurs, elles sont renvoyées, sinon, la Dll est crée ; j'ai vérifié le code à compiler, il est bel est bien OK.
    - L'assembly est trouvée, le Type utilisé est trouvé dans l'assembly, les méthodes sont trouvées, et les MethodInfo sont correctement récupérés via type.GetMethod().

    Et voilà que ça cloche, j'ai essayé deux manières différentes d'appeler la méthode : aucune exception n'est levée, mais le corps de la méthode ne s'exécute pas.

    Voilà la manière dont j'ai procédé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
                MethodInfo method = type.GetMethod("Behavior_" + InitData.BehaviorID.ToString() + "_Always",
                    BindingFlags.Public | BindingFlags.Static);
    Je récupère bien l'objet que je veux ici.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MethodAlways = (DelegateSimple)Delegate.CreateDelegate(typeof(DelegateSimple), method);
    Avec la déclaration suivante de DelegateSimple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    delegate void DelegateSimple(Event self);
    Le delegate est bien créé, jusque là, tout va bien.

    Cependant, ça cloche lorsque je l'appelle :
    - Soit avec Method.Invoke(null, [Ici un tableau contenant this en argument])
    - Soit avec MethodAlways(this)
    Dans les deux cas, rien ne se passe (de plus aucune exception n'est levée). Et malheureusement je ne vois pas du tout pourquoi cela ne marche pas. J'ai vérifié le code compilé, qui ressemble d'ailleurs à ceci :
    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
    using System;
    using Geex.Play.Rpg;
    using Geex.Edit;
    using Geex.Play.Rpg.Scripts;
    using Geex.Run;
    using UsineEnFolie.Platform;
    namespace UsineEnFolie.Platform
    {
        public class Behaviors_Maps__Test_1_Test_2_Map_01_map
        {
            // Nom = TOUJOURS
            public static void Behavior_0_Always(Event self)
            {
                self.RealX += 1;
                GlobalRefs.console.WriteLine("Test ! Test !");
                throw new Exception("Le code est lu !");
            }
            // Encore des méthodes...
         }
    }
    Donc je ne sais pas à quel niveau ça coince, et ça m'embête un peu ^^".

    Merci par avance de votre aide

  2. #42
    Expert confirmé Avatar de DonQuiche
    Inscrit en
    Septembre 2010
    Messages
    2 741
    Détails du profil
    Informations forums :
    Inscription : Septembre 2010
    Messages : 2 741
    Points : 5 485
    Points
    5 485
    Par défaut
    Allons bon...

    Tout d'abord, c'est bien MethodAlways qu'il faut utiliser : plus rapide, plus lisible, le problème ne peut pas venir de là. Attention à bien garder le délégué créé en cache par contre, sa création est coûteuse.

    Maintenant, pour en venir au problème, il n'y a qu'une seule possibilité qui me vienne à l'esprit, que le code généré ne soit pas celui que tu as copié. Je t'engage à vérifier avec ILSpy (équivalent gratuit du célèbre Reflector, désormais payant) la tronche de l'assembly créée.

    Songe aussi à vérifier la sortie de l'application (onglet output de VS) : certaines exceptions sont levées silencieusement par le débogueur (personnalisable dans le menu Debug > Exceptions...) et ne font l'objet que d'un trace.

  3. #43
    Membre à l'essai
    Profil pro
    Étudiant
    Inscrit en
    Mai 2009
    Messages
    48
    Détails du profil
    Informations personnelles :
    Âge : 30
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2009
    Messages : 48
    Points : 23
    Points
    23
    Par défaut
    Hum, alors le code "décompilé" est celui attendu :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    		public static void Behavior_0_Always(Event self)
    		{
    			self.set_RealX(self.get_RealX() + 1);
    			GlobalRefs.console.WriteLine("HAHAHA");
    		}
    Donc cela ne vient pas de là.
    J'ai fait un petit test supplémentaire en rajoutant la fonction suivante dans la dll :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    public static int TestMe2(int x)
    {
    	return x + 10;
    }
    Et bizarrement, en faisant comme avec les autres méthodes, cela me renvoyait la bonne valeur (TestMe2(5) => 15)...

    J'ai alors tenté autre chose : donner une valeur de retour (int) à mes méthodes. A l'intérieur du code j'ai donc changé les déclarations des fonctions et mis des return 2, sur chacune des méthodes...
    Et lorsque je fais ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    int y;
    y = MaMethode(this)
    y vaut 0, et non 2...

    La seule différence qu'il y a entre TestMe2 et les autres méthodes, c'est qu'elles prennent des arguments de type Event, contrairement à TestMe2 qui prend un int... Etrange !

  4. #44
    Expert confirmé Avatar de DonQuiche
    Inscrit en
    Septembre 2010
    Messages
    2 741
    Détails du profil
    Informations forums :
    Inscription : Septembre 2010
    Messages : 2 741
    Points : 5 485
    Points
    5 485
    Par défaut
    Hmmm, je me demande si ça ne pourrait pas être un problème entre les dépendances compilées pour le compact framework et celles compilées pour le framework normal. Evidemment je pense à la dépendance contenant la définition de la classe Event, comme si deux versions différentes étaient considérées comme une seule. Fusionlogw peut aider à diagnostiquer ces problèmes.

    Sinon, au niveau de la trace du programme (l'onglet output), rien de particulier à signaler ?

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

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2009
    Messages : 48
    Points : 23
    Points
    23
    Par défaut
    Non rien à signaler, sinon que pour une raison inconnue (en faisant des méthodes de test apparemment) cela fonctionne à présent !!

    En tout cas merci infiniment pour ton aide, ce problème est définitivement résolu !!

  6. #46
    Expert confirmé Avatar de DonQuiche
    Inscrit en
    Septembre 2010
    Messages
    2 741
    Détails du profil
    Informations forums :
    Inscription : Septembre 2010
    Messages : 2 741
    Points : 5 485
    Points
    5 485
    Par défaut
    J'espère simplement que ton problème ne reviendra pas t'exploser à la figure plus tard.

+ Répondre à la discussion
Cette discussion est résolue.
Page 3 sur 3 PremièrePremière 123

Discussions similaires

  1. Réponses: 44
    Dernier message: 02/08/2006, 16h12
  2. Erreur 3141 dans exécution de code
    Par zoom61 dans le forum Access
    Réponses: 13
    Dernier message: 23/03/2006, 17h31
  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, 18h26
  4. Réponses: 3
    Dernier message: 20/04/2005, 12h30
  5. Réponses: 7
    Dernier message: 03/02/2005, 17h20

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