Bir yenilik olarak, çalışma zamanında oluşturulan hafif koddan IL'nin ne kadar farklı olduğunu görmeye çalışıyorum çünkü VS kodunun VS derleyicisinin oluşturduğu kodu görüyorum, çünkü VS kodunun farklı bir performans profili ile çalışma eğiliminde olduğunu fark ettim. oyuncular gibi şeyler. Bir DynamicMethod'dan IL bytearray'i nasıl alabilirim?
yüzden aşağıdaki kodu :: GetMethodBody görünüşte ifade ağaçları ile üretilen kodun yasadışı operasyondur olarakFunc<object,string> vs = x=>(string)x;
Expression<Func<object,string>> exp = x=>(string)x;
var compiled = exp.Compile();
Array.ForEach(vs.Method.GetMethodBody().GetILAsByteArray(),Console.WriteLine);
Array.ForEach(compiled.Method.GetMethodBody().GetILAsByteArray(),Console.WriteLine);
Maalesef bu bir istisna atar yazdı. Kitaplık biçiminde (ör., Araç bir API olmadığı sürece harici bir araçla değil), hafif kodjen kullanarak kod tarafından oluşturulan koda nasıl bakabilirim?
Düzenleme: hata 5. satırda oluşur, compiled.Method.GetMethodBody() özel durumu atar.
Edit2: Yöntemde bildirilen yerel değişkenlerin nasıl kurtarılacağını bilen var mı? Ya da GetVariables için bir yolu yok mu?
Özel durum hangi satırı atar? İlk Array.ForEach 'a yorum yapabilir ve bunun işe yarayıp yaramadığını görebilir misiniz?GetMethodBody() 'ye yapılan ilk çağrının basitçe başarısız olduğunu, çünkü bu ifadenin IL'ye derlenmediğinden şüpheleniyorum. İkinci aramanın başarısız olması için bir neden göremiyorum. – cdhowie
İlginç bir soru. GetMethodBody çağrısında bir InvalidOperationException ("Nesnenin geçerli durumu nedeniyle geçerli değil") alıyorum. CachedAnonymousDelegate ve Expression gibi bir hayatın nasıl başladığını, davranışınızı Func olarak nasıl etkileyeceğinden emin değilim. Bunu çalışmaya devam edeceğim. – Sorax
Seçilen yanıt tüm vakaları kapsamadığı ve gereksiz yere karmaşık olduğu için değiştirilmelidir. Lütfen [bu cevap] bölümüne bakın (http://stackoverflow.com/a/35711507/521757). – jnm2