2012-03-18 27 views
8

Yansıma tabanlı C# kodunda dinamik yöntemlerle karşılaştım ve henüz tam olarak ne olduğunu anlamaya çalışıyorum. Özellikle çalışma zamanında CLR yöntemlerinin üretilmesine ve belirtilmesine izin veren bir DynamicMethod sınıfı var gibi görünüyor. Ama sonra da MethodBuilder sınıfı var. İkisi de çok benzer şeyler yapıyor gibi görünüyor. Görünüşe göre "dinamik derlemeler" AssemblyBuilder sınıfları ve "dinamik türler" TypeBuilder sınıflarıdır. Hepsi, her durumda System.Reflection.Emit ad alanında bulunur.Dinamik yöntemler nelerdir ve DynamicMethod, MethodBuilder öğesinden farklıdır?

MSDN, bu konuda değerli küçük yüksek düzeyde bilgilere sahip gibi görünüyor. Eğer birisi dinamik yöntemlerin ne olduğunu açıklayabilirse, burada XYZBuilder derslerinin tam olarak nerede olduğu ve her birinin ne işe yaradığı açıklanabilirse, bu harika olur. Bilmem gereken diğer Reflection.Emit türleri ve işlevleri de takdir edilecektir. Ben the documentation for DynamicMethod düşünüyorum

cevap

9

iyi açıklıyor:

Bir dinamik montaj ve yöntemi içerecek şekilde dinamik bir türü oluşturmak zorunda kalmadan, üretmek ve çalışma zamanında bir yöntemi uygulamak için DynamicMethod sınıfını kullanabilirsiniz. Tam zamanında (JIT) derleyici tarafından oluşturulan yürütülebilir kod, DynamicMethod nesnesi yeniden sağlandığında yeniden hak kazanılır. Dinamik yöntemler küçük miktarlarda kod oluşturmanın ve yürütmenin en etkili yoludur.

Dinamik olarak bir veya daha fazla yöntem oluşturmanız gerekiyorsa, DynamicMethod'u kullanın. Bütün türleri oluşturmak istiyorsanız, dinamik bir derleme (AssemblyBuilder) oluşturmanız, ardından bunun içinde bir modül oluşturmanız (ModuleBuilder) ve bir veya daha fazla tür (TypeBuilder) oluşturmanız gerekir. Bu türlerde yöntemler oluşturmak için MethodBuilder kullanırsınız.

Diğer bir fark ise GC: DynamicMethod s her zaman toplanmış olabilir ve tek tek toplanır. Yani, kullanmayı bıraktığınız anda herhangi bir yöntem toplanabilir. Diğer yandan dinamik montajlar sadece belirttiğinizde (AssemblyBuilderAccess.RunAndCollect kullanarak) toplanabilir ve her zaman montaj ile toplanır. Örneğin, bir derlemede iki tür varsa ve bunlardan yalnızca birini kullanıyorsanız, diğeri toplanamaz.

+0

Doh. MSDN sayfalarını çok geç okurken bunu kaçırmış olmalıyım. Teşekkürler. – Noldorin