2009-11-22 15 views
8

Dinamik olarak oluşturulmuş olandan bir iç yöntemi çağırmaya çalışıyorum. Il kodu basit: ldarg_0, callvirt, ret..NET'te içsel yöntemi dinamik bir yöntemden çağırmak mümkün mü?

Yöntemin çalıştırılması, iç yöntemin tanımlandığı türün yüklenemediğini söyleyen TypeLoadException ile başarısız olur.

Bunu düşündüğümde, bu mantıklı görünüyor, çünkü dinamik yöntem ana bilgisayar derlemesi, yöntemin bildiren tür montajının bir arkadaşı değil. Ancak, Delegate.CreateDelegate gibi çalıştığı halde dinamik yöntemin çalışmaya devam etmesini beklemekteyim. Sonuçta, iç metodun MethodInfo'sini almayı başardım, bu yüzden izinler bariyeri geride kaldı. Her neyse, soru şu: "dinamik olarak oluşturulmuş olandan dahili bir yöntemi çağırmak mümkün mü?"

Teşekkürler.

DÜZENLEME:

: Ben Data.String örnek özelliğine erişmek için iki açık örnek delege oluşturmak kodunda

using System; 
using System.Linq.Expressions; 
using System.Reflection; 
using System.Reflection.Emit; 

namespace A 
{ 
    internal class Data 
    { 
    internal string String { get; set; } 
    } 

    public static class Program 
    { 
    public static void Main() 
    { 
     Expression<Func<Data, string>> expr = x => x.String; 
     var getterInfo = ((PropertyInfo)((MemberExpression)expr.Body).Member).GetGetMethod(true); 
     var getter1 = (Func<Data, string>)Delegate.CreateDelegate(typeof(Func<Data, string>), getterInfo); 
     var dm = new DynamicMethod(string.Empty, typeof(object), new Type[] { typeof(object) }); 
     var gen = dm.GetILGenerator(); 
     gen.Emit(OpCodes.Ldarg_0); 
     gen.Emit(OpCodes.Castclass, typeof(Data)); 
     gen.Emit(OpCodes.Callvirt, getterInfo); 
     gen.Emit(OpCodes.Ret); 
     var getter2 = (Func<object, object>)dm.CreateDelegate(typeof(Func<object, object>)); 

     var data = new Data() { String = "Hello" }; 
     var str1 = getter1(data); 
     var str2 = getter2(data); 
    } 
    } 
} 

: Burada

sorunu gösteren basit bir kod örneği olduğunu

  • güvenli yazım hatası getTeg1 kullanarak Delegate.CreateDelegate
  • type uns afe getter2 DynamicMethod

Delegate.CreateDelegate yarattığı tip güvenli temsilci çalışır kullanarak, DynamicMethod kullanarak tek TypeLoadException ile başarısız olurken.

Not alıcının oluşturulduğu bağlam genel olmadığından, tür güvenli yaklaşımını almak istemediğimi unutmayın. Tabii ki, bu sorunu çözebilirim, ama soru şu an müdürün - Delegate.CreateDelegate'in başarılı olduğu DinamikMethod'un neden başarısız olduğu?

+0

Bir TypeLoadException, derlemenin bulunamadığını ima eder - füzyon günlüğü görüntüleyicisi ne diyor? –

+0

Füzyon günlüğü boş. Montajı yüklemek için sorun olmamalıdır. Tüm ilgili derlemeler aynı klasörde bulunur. – mark

+0

@JeremyMcGee haklı. Hata ayıklama modu sırasında AppDomain'de yüklü derlemeler listesini alın ve orada hedef derleme olduğunu kontrol edin. Ayrıca, kodunuzu kontrol etmek için buraya koymak daha iyidir. –

cevap

6

Görünürlük kontrollerini atlarsanız çalışır.

Değişim

var dm = new DynamicMethod(string.Empty, typeof(object), new Type[] { typeof(object) }, true); 

msdn bakınız bu satırı: (. Özellikle tablodaki tüm kuralları ile)

Bu yapıcı Doco değil.

restrictedSkipVisibility Tür: Bu kısıtlama dinamik yöntemin MSIL tarafından erişilen türleri ve üyeleri JIT görünürlük kontrolleri atlamak için gerçek System.Boolean: olanlar içerdiğini montajların güven düzeyi türleri ve üyeleri, dinamik yöntemini çağıran çağrı yığınının düzeyine eşit veya daha az olmalıdır; aksi halde, yanlış.

+0

DynamicMethod, .net standardında, .net standardında bunu yapmanın herhangi bir yolu yok mu? – trampster

İlgili konular