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 :

Appel d'un delegate de control avec une methode dynamique


Sujet :

C#

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Janvier 2013
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2013
    Messages : 2
    Points : 2
    Points
    2
    Par défaut Appel d'un delegate de control avec une methode dynamique
    Bonsoir,

    J'aurais une 'petite' question...

    J’écris un code pour ajouter une méthode dynamique a un évènement.
    - La méthode dynamique appelle une autre méthode ("Raise") avec cette signature "public void Raise(params object[] param);"

    Voici la partie du code qui s'occupe de ça...
    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
     
                // get event info
                eventInfo= o.GetType().GetEvent(EventName);
                MethodInfo mid = eventInfo.EventHandlerType.GetMethod("Invoke");
                ParameterInfo[] paraminfo = mid.GetParameters();
                List<Type> paramtype = new List<Type>();
                paramtype.Add(GetType());
                foreach (ParameterInfo t in paraminfo) { paramtype.Add(t.ParameterType); }
                // get Raise local methode info 
                MethodInfo raise = GetType().GetMethod("Raise");
                // DynamicMethod
                DynamicMethod dm = new DynamicMethod("LocalRaiseEvent", mid.ReturnType, paramtype.ToArray(), GetType().Module/*_oevent.Module/*,raise.Module*/);
                ILGenerator ilg = dm.GetILGenerator();
                for (int bc = 0; bc < paramtype.Count; bc++) {
                    ilg.Emit(OpCodes.Ldarg, bc);
                }
                ilg.Emit(OpCodes.Call, raise);
                ilg.Emit(OpCodes.Ret);
                // Add
                _oevent.AddEventHandler(o, dm.CreateDelegate(eventInfo.EventHandlerType, this));

    Si l’évènement d'origine vient d'une classe que j'ai crée cela passe très bien, par contre si je prends un Control (une form par exemple) une exception estlevée "InvalidProgramException- Le compilateur JIT a rencontré une limitation interne"

    Il y aurait il des idées du pourquoi j'ai cette erreur et surtout comment l'eviter?

    Merci

  2. #2
    Membre expert
    Avatar de GuruuMeditation
    Homme Profil pro
    .Net Architect
    Inscrit en
    Octobre 2010
    Messages
    1 705
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : Belgique

    Informations professionnelles :
    Activité : .Net Architect
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2010
    Messages : 1 705
    Points : 3 570
    Points
    3 570
    Par défaut
    C'est parce que DynamicMethod génère une méthode statique et, de ce fait, le 1er arg que tu mets sur le stack (qui correspond au "this") n'est jamais utilisé et ça perturbe le JIT.

    avant le ilg.Emit(OpCodes.Ret), mets un ilg.Emit(OpCodes.Pop); pour nettoyer le stack.

    Par contre je ne sais pas pourquoi ça marche avec certains de tes events

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Janvier 2013
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2013
    Messages : 2
    Points : 2
    Points
    2
    Par défaut
    Citation Envoyé par GuruuMeditation Voir le message
    avant le ilg.Emit(OpCodes.Ret), mets un ilg.Emit(OpCodes.Pop); pour nettoyer le stack.
    Merci, ca fonctionne maintenent, enfin dans la version exposé ici

    Ecribi

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

Discussions similaires

  1. [Windows Phone 8] problème appel de webservice avec une methode async ne fonctionne qu'une fois
    Par slacky dans le forum Windows Phone
    Réponses: 0
    Dernier message: 18/05/2015, 13h39
  2. [AC-2003] compléter automatiquement un controle avec une macro
    Par patrickCG40 dans le forum IHM
    Réponses: 1
    Dernier message: 02/12/2009, 13h55
  3. Réponses: 2
    Dernier message: 09/11/2007, 15h32
  4. Reproduire des controles avec une boucle
    Par paradeofphp dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 19/06/2006, 11h46
  5. [Reflection][Bean] Appel d'une méthode dynamiquement
    Par eraim dans le forum API standards et tierces
    Réponses: 2
    Dernier message: 28/04/2004, 11h07

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