Aracılığıyla paylaş


System.Reflection.Emit.DynamicMethod sınıfı

Bu makale, bu API'nin başvuru belgelerine ek açıklamalar sağlar.

sınıfını DynamicMethod kullanarak çalışma zamanında bir yöntemi oluşturmak ve yürütmek için, bir dinamik derleme ve yöntemini içerecek dinamik bir tür oluşturmak zorunda kalmadan kullanabilirsiniz. Tam zamanında (JIT) derleyicisi tarafından oluşturulan yürütülebilir kod, DynamicMethod nesnesi geri alındığında geri kazanılır. Dinamik yöntemler, az miktarda kod oluşturmanın ve yürütmenin en verimli yoludur.

Dinamik bir yöntem anonim olarak barındırılabilir veya mantıksal olarak bir modülle veya bir türle ilişkilendirilebilir.

  • Dinamik yöntem anonim olarak barındırılıyorsa, sistem tarafından sağlanan bir derlemede bulunur ve bu nedenle diğer kodlardan yalıtılır. Varsayılan olarak, genel olmayan verilere erişimi yoktur. Anonim bir şekilde barındırılan bir dinamik yöntem, ReflectionPermission bayrağıyla yetkilendirilmişse, ReflectionPermissionFlag.RestrictedMemberAccess JIT derleyicisinin görünürlük denetimlerini atlama yeteneği sınırlı olabilir. Dinamik yöntem tarafından erişilen özel üyeleri olan derlemenin güven düzeyi, dinamik yöntemin yaydığı çağrı yığınının güven düzeyine eşit veya onun bir alt kümesi olmalıdır. Anonim olarak barındırılan dinamik yöntemler hakkında daha fazla bilgi için bkz . İzlenecek Yol: Kısmi Güven Senaryolarında Kod Yayma.

  • Dinamik yöntem belirttiğiniz bir modülle ilişkiliyse, dinamik yöntem bu modül için etkili bir şekilde geneldir. Modüldeki tüm türlere ve türlerin internal üyelerinin tümüne (Friend Visual Basic'te) erişebilir. Kodunuzu içeren çağrı yığını, ReflectionPermission bayrağı ile bir RestrictedMemberAccess talebini karşılayabildiği sürece, modülü kendiniz oluşturmuş olmasanız bile herhangi bir modülle dinamik bir yöntem ilişkilendirebilirsiniz. Eğer ReflectionPermissionFlag.MemberAccess bayrağı izin kapsamında dahil edilirse, dinamik yöntem JIT derleyicisinin görünürlük denetimlerini atlayabilir ve modülde veya herhangi bir derlemedeki diğer herhangi bir modülde bildirilen tüm türlerin özel verilerine erişebilir.

    Uyarı

    Bir dinamik yöntemin ilişkilendirildiği modülü belirttiğinizde, bu modül anonim barındırma için kullanılan sistem tarafından sağlanan derlemede olmamalıdır.

  • Dinamik yöntem belirttiğiniz bir türle ilişkiliyse, erişim düzeyinden bağımsız olarak türün tüm üyelerine erişimi olur. Ayrıca JIT görünürlük denetimleri atlanabilir. Bu, dinamik yönteme aynı modülde veya herhangi bir derlemedeki diğer modüllerde bildirilen diğer türlerin özel verilerine erişim verir. Bir dinamik yöntemi herhangi bir türle ilişkilendirebilirsiniz, ancak kodunuza hem ReflectionPermission hem de RestrictedMemberAccess bayraklarıyla MemberAccess yetki verilmesi gereklidir.

Anonim olarak barındırılan dinamik bir yöntemin, bayrak ReflectionPermission veya RestrictedMemberAccess verildiğinde, JIT görünürlüğü denetimleri olsun ya da olmasın, hangi tür ve üyelerin erişilebilir olduğunu gösteren tablo aşağıda yer almaktadır.

Görünürlük denetimleri RestrictedMemberAccess olmadan RestrictedMemberAccess ile
JIT görünürlük denetimlerini atlamadan Herhangi bir derlemedeki ortak türlerin genel üyeleri. Herhangi bir derlemedeki ortak türlerin genel üyeleri.
Kısıtlamalarla birlikte JIT görünürlük denetimlerini atlama Herhangi bir derlemedeki ortak türlerin genel üyeleri. Tüm türlerin tüm üyeleri, yalnızca dinamik yöntemi yayan derlemenin güven düzeyine eşit veya daha düşük güven düzeyine sahip derlemelerde yer alabilir.

Aşağıdaki tabloda, bir modülle veya modüldeki bir türle ilişkilendirilmiş dinamik bir yöntem için hangi türlerin ve üyelerin erişilebilir olduğu gösterilmektedir.

JIT görünürlük denetimlerini atlama Modülle ilişkilendirilmiş Türle ilişkilendirilmiş
Hayı Modüldeki genel, iç ve özel türlerin genel ve iç üyeleri.

Herhangi bir derlemedeki ortak türlerin genel üyeleri.
İlişkili türün tüm üyeleri. Modüldeki diğer tüm türlerin genel ve dahili üyeleri.

Herhangi bir derlemedeki ortak türlerin genel üyeleri.
Evet Herhangi bir bütünlemedeki tüm türlerin tüm üyeleri. Herhangi bir bütünlemedeki tüm türlerin tüm üyeleri.

Bir modülle ilişkili dinamik yöntem, bu modülün izinlerine sahiptir. Bir türle ilişkili dinamik yöntem, bu türü içeren modülün izinlerine sahiptir.

Dinamik yöntemlerin ve parametrelerinin adlandırılması gerekmez, ancak hata ayıklamaya yardımcı olması için adları belirtebilirsiniz. Özel öznitelikler dinamik yöntemlerde veya parametrelerinde desteklenmez.

Dinamik yöntemler static yöntemler (Shared Visual Basic'teki yöntemler) olsa da, temsilci bağlamaya yönelik gevşek kurallar, dinamik bir yöntemin bir nesneye bağlanmasına olanak tanır, böylece bu temsilci örneği kullanılarak çağrıldığında örnek yöntemi gibi davranır. Bu CreateDelegate(Type, Object) yöntem aşırı yüklemesi için bir örnek sağlanmıştır.

Doğrulama

Aşağıdaki liste, dinamik yöntemlerin hangi koşullar altında doğrulanamaz kod içerebileceğini özetlemektedir. (Örneğin, dinamik bir yöntem, özelliği InitLocals olarak ayarlanırsa false onaylanamaz.)

  • Güvenlik açısından kritik bir derlemeyle ilişkili dinamik bir yöntem de güvenlik açısından kritiktir ve doğrulamayı atlayabilir. Örneğin, masaüstü uygulaması olarak çalıştırılan güvenlik öznitelikleri olmayan bir derleme, çalışma zamanı tarafından güvenlik açısından kritik olarak değerlendirilir. Bir dinamik yöntemi derlemeyle ilişkilendirirseniz, dinamik yöntem doğrulanamaz kod içerebilir.
  • Onaylanamayan kod içeren dinamik bir yöntem düzey 1 saydamlığı olan bir derlemeyle ilişkiliyse, tam zamanında (JIT) derleyicisi bir güvenlik talebi ekler. Talep yalnızca dinamik yöntem tam güvenilir kod tarafından yürütülürse başarılı olur. Bkz. Security-Transparent Kodu, Düzey 1.
  • Doğrulanamayan kod içeren dinamik bir yöntem düzey 2 saydamlığı (mscorlib.dllgibi) olan bir derlemeyle ilişkiliyse, güvenlik talebi oluşturmak yerine bir özel durum oluşturur (JIT derleyicisi tarafından eklenir). Bkz. Security-Transparent Kodu, Düzey 2.
  • Doğrulanamayan kod içeren anonim olarak barındırılan dinamik yöntem her zaman bir özel durum oluşturur. Tam olarak güvenilen kod tarafından oluşturulup yürütülse bile doğrulamayı asla atlayabilir.

Doğrulanamayan kod için oluşan özel durum, dinamik yöntemin çağrılma şekline bağlı olarak değişir. CreateDelegate yönteminden döndürülen bir temsilciyi kullanarak dinamik bir yöntem çağırırsanız, bir VerificationException fırlatılır. Eğer Invoke yöntemini kullanarak dinamik yöntemi çağırırsanız, bir iç TargetInvocationException ile bir VerificationException fırlatılır.