Bonjour,
Quelqu'un a d�j� utilis� du il.Emit pour g�n�rer des m�thodes au runtime ?
Il faut forc�ment un d�l�gate pour appeler la m�thode ainsi g�n�r�e ?
En C++/CLI je peux aussi r�cup�rer un pointeur de m�thode, non ? (avec InteropServices.Marshal.GetFunctionPointerForDelegate ou MethodInfo RuntimeMethodHandle.GetFunctionPointer ?)

Ici je voudrais faire un g�n�rateur dynamique de stub interpr�t�->compil�, c'est � dire un stub qui permet appeler une m�thode en lui passant un tableau de param�tres (donc exactement ce que fait MethodInfo.Invoke mais en plus efficace en terme de perf vu que MethodInfo.Invoke fait plein de choses "inutiles", alors qu'un stub ne fait que 10 instructions MSIL) :

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
21
22
23
24
 
/// classe et méthode compilée
ref class A {
 String^ UneMethode(Int32 k, array<Type^> t) {
    /* ... */
 }
};
 
/// classe qui génère des stub
ref class StubFactory {
   D^ GenerateStubFor(MethodInfo ^m) {
      il.Emit(...)
      il.Emit(...)
   }
 
   /// méthode générée dynamiquement avec il.Emit
   static Object^ A_UneMethode_Stub(Object^ obj, array<Object^>^params) {
       // implémentation en C++/CLI en guise d'exemple, c'est en MSIL qu'il       
      //faut savoir la coder pour pouvoir la générer dynamiquement
      return (*((A^*)&obj))->UneMethode((Int32)params[0],(array<Object^>^)params[1]);
      /// le cast *((A^*)&obj)) est un static_cast : il permet d'éviter le dynamic_cast qui fait le runtime check du type (qui est coûteux si on sait déjà à l'avance que le type est bon). 
      /// Pour params[0] et params[1] je pense qu'on ne peut pas y échapper.
   }
};
Je m'�tonne de ne pas trouver sur google quelqu'un qui aurait d�j� cod� la m�me chose.

Je pense que StubFactory.GenerateStubFor devrait renvoyer un D^ qui serait un type de delegate :
Code : S�lectionner tout - Visualiser dans une fen�tre � part
delegate Object ^ D(Object^ obj, array<Object^>^params);
Ensuite, j'aimerais aussi faire la m�me chose pour PropertyInfo/FieldInfo.Get/Set Value.

Une derni�re question : c'est compliqu� d'appeler une m�thode C++ native __stdcall depuis du IL g�n�r� avec il.Emit ?
Je pense m'en sortir en utilisant ILdasm sur des bouts de code C++/CLI tr�s simple me servant d'exemple

Une toute derni�re question : est-ce qu'il faut vraiment g�n�rer dynamiquement (avec il.emit) un stub par m�thode, ou est-ce qu'il serait possible d'�crire, statiquement, donc sans passer par il.emit, une seule m�thode (enti�rement �crite en MSIL) qui pour n'importe quel type de m�thode arrive � pousser le tableau de param�tre sur la pile et � faire le call ?

A mon avis pour �crire un champ d'un objet on est oblig� de passer par il.Emit (il n'y a aucune fonction de la r�flection qui donne l'offset runtime d'un champ, donc impossible de faire une fonction g�n�rique capable d'�crire/lire un champ)