2013-01-11 19 views
5

Birisi bana, yansıma.emit aracılığıyla işlev çağrısı yapmadan önce yığında neyin yüklenmesi gerektiğini açıklayabilir mi? Yansıma yayma yığını ve yöntem çağrısı

Ben çok basit bir yöntemini

Dinamik şu sınıfta yöntemi oluşturmak istiyorum
public static void Execute(string 1, string 2) 

(Onları dizildi var, geri kalanını unutmak)

public class Test{ 
    public string s1; 

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

Bende bir kopyası var olması Yukarıdaki testin referansı için, ve "çağrı" dan önce aşağıdaki op kodları yayınlandığını fark ettim.

  1. ldarg_1
  2. ldarg_0
  3. ldfld

soru ldarg_0 orada ne yaptığını nedir? Arama için sadece 2 argümana ihtiyacım var, neden CLR ldarg_0'ın yığına itilmesini gerektiriyor?

+0

Çevreleyen IL'yi sağlayabilir misiniz? –

cevap

9

arg.0, this'u içerir ve ldfld string Test:s1 tarafından yığına this.s1 öğesini zorlamak için gerekir.

.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

Teşekkürler! Şimdi neyi özlediğimi biliyorum. – Alwyn

2

Yöntem statik değilse, yöntemin argümanlarını bildirim sırasına ve nesne başvurusuna itmeniz gerekir. Test durumunuzda, bir üye alanına (s1) erişiyorsanız, bunun için this referansına ihtiyacınız vardır. ldarg_0'un sağladığı şey budur. Sonraki ldfld, this referansını çıkarır ve alan değerini değerlendirme yığınının üzerine iter.