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

Framework .NET Discussion :

Injection de MSIL au runtime


Sujet :

Framework .NET

  1. #1
    Expert éminent
    Avatar de smyley
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    6 270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 6 270
    Points : 8 344
    Points
    8 344
    Par défaut Injection de MSIL au runtime


    J'ai une fonction qui ressemble un peut à ça :
    Code c# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    public virtual void SayHello(string name)
    {
      byte[] code = ...
    }
    Dedans, code c'est le corps d'une fonction de la même classe avec la même signature (juste le nom qui change à priori) :
    Code c# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    public virtual void Hello(string name)
    {
     Console.WriteLine(String.Format("Bonjour {0} !",name));
    }
    et donc code contient le code MSIL de :
    Code c# : Sélectionner tout - Visualiser dans une fenêtre à part
    Console.WriteLine(String.Format("Bonjour {0} !",name));
    Donc directement du "bytecode".

    Puis-je exécuter le code dans le contexte de SayHello, comme si j'avais mis la ligne "Console.WriteLine" dans SayHello ? J'ai pensé à utiliser DynamicMethod mais a priori avec on ne peut générer que des méthodes statiques (je veux pouvoir accéder à partir de mon code IL aux membres d'instances de la classe qui contient SayHello, et que la référence à This dans ce dernier soit bien la classe qui contient SayHello). J'ai regardé MethodRental aussi mais ça ne marche que sur les types générés dynamiquement. Comment puis-je alors faire ?

  2. #2
    Membre expérimenté Avatar de davcha
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    1 258
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 1 258
    Points : 1 539
    Points
    1 539
    Par défaut
    PostSharp ?

  3. #3
    Expert éminent
    Avatar de smyley
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    6 270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 6 270
    Points : 8 344
    Points
    8 344
    Par défaut
    Que je sache postsharp c'est de la post-compilation non ? il modifie la dll une fois compilée et ensuite c'est cette dll qu'on exécute ... moi je suis dans le cas où j'ai déjà tout chargé et que je veux exécuter en live du code msil (ou plutôt du bytecode IL) dans le contexte de la méthode actuelle ...

  4. #4
    Membre expérimenté Avatar de davcha
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    1 258
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 1 258
    Points : 1 539
    Points
    1 539
    Par défaut
    http://www.postsharp.org/aop.net/runtime-weaving/

    Tiens, sinon, simple curiosité : pourquoi du bytecode msil ?

  5. #5
    Expert éminent
    Avatar de smyley
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    6 270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 6 270
    Points : 8 344
    Points
    8 344
    Par défaut
    Je vois pas comment m'en servir pour faire ce que je veux ...

    Pourquoi ? délire ...
    Je m'amuse à extraire le code d'une méthode via la réflection, j'ai donc un byte[] qui contient le code de la fonction. Et je veux l'exécuter dans une autre méthode mais qui es dans la même assembly et qui a les mêmes paramètres ... et j'y arrive pas.
    En C/C++ cela reviendrais à exécuter directement du code x86 stocké dans un pointeur, et je veux faire pareil mais avec de l'IL ...

  6. #6
    Membre expérimenté Avatar de davcha
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    1 258
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 1 258
    Points : 1 539
    Points
    1 539
    Par défaut
    Oui, mais je vois pas pourquoi du bytecode msil, et pas un délégué, par exemple.

  7. #7
    Expert éminent
    Avatar de smyley
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    6 270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 6 270
    Points : 8 344
    Points
    8 344
    Par défaut
    Bah en fait je souhaite pouvoir remplacer à la volée le code d'une méthode par un autre. Ce code je l'extrait à partir d'une autre assembly et je le met ailleurs, par exemple, dans une base de donnée. Après lors de l'exécution, je souhaite pouvoir le réinjecter à sa place dans la méthode (sachant qu'entre temps je l'ai viré de l'assembly).
    Il n'y a pas vraiment d'enjeux à la faire, c'est simplement que je sais qu'on peut le faire en natif en hookant le JIT pour injecter à la volée du MSIL avant d'appeler le compilateur JIT. Sauf que j'aurai aimé le faire en purement managé ce qui passe donc par l'exécution d'un bloc de bytecode pure en mémoire.
    Le code que je cherche est quelque chose qui pourrai me faire du genre :
    Code c# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    public virtual bool MaMethode(string param)
    {
     byte[] code = _GetCode_("MaMethode");
     _UnTruc_ = new _UnTruc_(code);
     return _UnTruc_.Invoke(param);
    }

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 156
    Points : 173
    Points
    173
    Par défaut
    Bonjour,

    Je ne suis pas un pro de l'injection de MSIL. Mais je pense que j'ai une piste pour toi. Mono.Cecil te permet de modifier des assemblés comme tu le désires. Ajouter/modifier des méthodes à la volée.

    http://www.mono-project.com/Cecil

    Bonne chance.

  9. #9
    Expert éminent
    Avatar de smyley
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    6 270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 6 270
    Points : 8 344
    Points
    8 344
    Par défaut
    Citation Envoyé par Archeone Voir le message
    Je ne suis pas un pro de l'injection de MSIL. Mais je pense que j'ai une piste pour toi. Mono.Cecil te permet de modifier des assemblés comme tu le désires. Ajouter/modifier des méthodes à la volée.
    Justement non (du moins, il me semble). Mono.Cecil permet de charger l'assembly, de la modifier, mais ensuite pour l'exécuter on es obligé de sauvegarder de nouveau l'assembly sur le disque ou en mémoire pour ensuite la charger et l'exécution avec Assembly.Load. Sauf que j'aurai préféré ne pas avoir à faire cette étape (bien que si c'est vraiment impossible, je pense repasser par cette solution ...)

  10. #10
    Candidat au Club
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 2
    Points : 2
    Points
    2
    Par défaut
    Je te conseil la formidable library open source dynamicutilities. Tu la trouveras ici http://www.codeplex.com/Dynamic.

    Cette bibliothèque te permet facilement de faire de la reflection et faire des appels sur des methodes private par exemple ou encore executer du code msil à la volée. Pour le msil utilise la classe DynamicEmit.

  11. #11
    Membre expérimenté Avatar de davcha
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    1 258
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 1 258
    Points : 1 539
    Points
    1 539
    Par défaut
    Citation Envoyé par smyley Voir le message
    Bah en fait je souhaite pouvoir remplacer à la volée le code d'une méthode par un autre.
    Jusque là, ok... Ca me fait penser aux délégués.

    Citation Envoyé par smyley Voir le message
    Ce code je l'extrait à partir d'une autre assembly et je le met ailleurs, par exemple, dans une base de donnée. Après lors de l'exécution, je souhaite pouvoir le réinjecter à sa place dans la méthode (sachant qu'entre temps je l'ai viré de l'assembly).
    Et là, curiosité toujours, je me demande quel est le but final de la manip.
    Et accessoirement, je me demande si ça ne pose pas des problèmes de références manquantes...

  12. #12
    Expert éminent
    Avatar de smyley
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    6 270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 6 270
    Points : 8 344
    Points
    8 344
    Par défaut
    Citation Envoyé par davcha Voir le message
    Et là, curiosité toujours, je me demande quel est le but final de la manip.
    Et accessoirement, je me demande si ça ne pose pas des problèmes de références manquantes...
    Cela me permettrai de charger du code dynamiquement en fonction de l'utilisateur actuel et de ses droits par exemple. Et non, normalement pas de problèmes de références vu que le code à la base était bien dans cette dll. Je l'ai par la suite extrait, mais juste lui, je n'ai pas touché au reste de l'assembly et c'est pour ça que je souhaite donc l'invoquer dynamiquement dans le contexte d'origine sans passer par une sauvegarde de l'assembly en entier.

  13. #13
    Membre éprouvé Avatar de anthyme
    Homme Profil pro
    Inscrit en
    Mars 2004
    Messages
    1 559
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2004
    Messages : 1 559
    Points : 1 257
    Points
    1 257
    Par défaut
    Quid de la maintenabilité du truc ?

  14. #14
    Expert éminent
    Avatar de smyley
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    6 270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 6 270
    Points : 8 344
    Points
    8 344
    Par défaut
    Mais arrêtez de casser mon délire !
    Je veux faire quelque chose, le pourquoi c'est pas ça l'important, mais j'ai vraiment envier de le mener à terme ... j'ai plusieurs petits trucs du même genre dans un dossier Experiments qu'il m'arrive parfois de réutiliser dans un de mes projets. Par exemple j'ai fait un petit Sudoku (cf. forum Mon programme) qui au départ était une expérimentation pour la génération d'une grille ... mais là je sèche vraiment je ne sais pas comment faire pour exécuter mon code il ...

  15. #15
    Membre expérimenté Avatar de davcha
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    1 258
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 1 258
    Points : 1 539
    Points
    1 539
    Par défaut
    Si ta dll est toujours là, pourquoi ne pas copier une référence vers ce qui doit être exécuté plutôt que de copier le code à exécuter ?

    C'est à dire au lieu de sauvegarder le corps de la méthode à exécuter, tu ne sauvegardes que la signature de la méthode à exécuter. Genre son nom, ses arguments, ses modifieurs... Ensuite tu retrouves la méthode par réflexion quand tu as besoin de l'appeler...

    Ca semble moins barbare. C'est ptet un peu barbare quand même remarque.

  16. #16
    Expert éminent
    Avatar de smyley
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    6 270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 6 270
    Points : 8 344
    Points
    8 344
    Par défaut
    C'est pas amusant, parce que ça je sais faire.
    Je veux pouvoir changer à la volée le code d'une assembly entre différentes versions disponibles et ce au niveau global sans devoir modifier le code appelant mais faire la modification on-the-fly directement sur l'assembly au chargement de cette dernière.

  17. #17
    Membre expérimenté Avatar de davcha
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    1 258
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 1 258
    Points : 1 539
    Points
    1 539
    Par défaut
    une facade + l'histoire de la réflexion du post précédent ?...

  18. #18
    Expert éminent
    Avatar de smyley
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    6 270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 6 270
    Points : 8 344
    Points
    8 344
    Par défaut
    nop

  19. #19
    Membre chevronné
    Profil pro
    Inscrit en
    Février 2005
    Messages
    1 273
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 1 273
    Points : 2 202
    Points
    2 202
    Par défaut
    Je crois que ta réponse est lcg :
    http://msdn.microsoft.com/en-us/libr...micmethod.aspx

Discussions similaires

  1. Injection d'opcodes au runtime
    Par az0101 dans le forum Contribuez
    Réponses: 4
    Dernier message: 11/05/2010, 19h56
  2. [TP]Runtime error 106 à l'exécution
    Par BlackTiger dans le forum Turbo Pascal
    Réponses: 2
    Dernier message: 25/01/2004, 21h50
  3. [LG]runtime error 202
    Par picsou123 dans le forum Langage
    Réponses: 2
    Dernier message: 14/11/2003, 22h53
  4. Runtime VC++ ou MFC
    Par Elodie_nl dans le forum MFC
    Réponses: 9
    Dernier message: 03/12/2002, 17h23
  5. [Kylix] Runtime error 230 avec INDY
    Par Anonymous dans le forum EDI
    Réponses: 2
    Dernier message: 23/03/2002, 11h51

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