2013-01-11 14 views
5

Qualcuno può spiegarmi cosa deve essere caricato nello stack prima di effettuare una chiamata di funzione tramite reflection.emit?Reflection emit stack e method call

Ho un metodo molto semplice

public static void Execute(string 1, string 2) 

voglio generare il metodo nella classe seguente modo dinamico (dimenticare il resto, ho ottenuto li risolto)

public class Test{ 
    public string s1; 

    public void Run(string s2) 
    { 
     MyOtherClass.Execute(s2,s1) 
    } 
} 

ho una copia del test precedente, per riferimento, e ho notato che i seguenti codici operativi sono stati emessi, prima della "chiamata".

  1. ldarg_1
  2. ldarg_0
  3. ldfld

La domanda è: cosa sta facendo lì ldarg_0? Ho solo bisogno di 2 argomenti per la chiamata, perché il CLR richiede che ldarg_0 venga inserito nello stack?

+0

Potete fornire l'IL circostante? –

risposta

9

arg.0 contiene this ed è richiesto da ldfld string Test:s1 per inviare this.s1 sullo stack.

.method public hidebysig instance void Run(string s2) cil managed 
{ 
    .maxstack 8          // maximum stack size 8 
    ldarg.1           // push argument s2 
    ldarg.0           // push this 
    ldfld string Test::s1       // pop this, push this.s1 
    call void MyOtherClass::Execute(string, string) // call 
    ret            // return 
} 
+0

Grazie! So cosa mi è mancato ora. – Alwyn

2

È necessario inoltrare gli argomenti del metodo in ordine di dichiarazione e un riferimento a un oggetto se il metodo non è statico. Nel tuo caso di test, stai accedendo ad un campo membro (s1), quindi hai bisogno del riferimento this per questo. Questo è ciò che fornisce ldarg_0. Il successivo ldfld apre il riferimento this e inserisce il valore del campo nello stack di valutazione.

Problemi correlati