Share via


Sistem. Düşünceler. Emit.DynamicMethod sınıfı

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

sınıfını DynamicMethod kullanarak, bir dinamik derleme ve yöntemini içerecek dinamik bir tür oluşturmak zorunda kalmadan çalışma zamanında bir yöntem oluşturabilir ve yürütebilirsiniz. Tam zamanında (JIT) derleyicisi tarafından oluşturulan yürütülebilir kod, nesne geri kazanıldığında DynamicMethod geri alını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 olarak barındırılan bir dinamik yöntem, bayrağıyla ReflectionPermissionFlag.RestrictedMemberAccess verilmişse ReflectionPermission JIT derleyicisinin görünürlük denetimlerini atlayabilir. Genel olmayan üyeleri dinamik yöntem tarafından erişilen derlemenin güven düzeyi, dinamik yöntemin yaydığı çağrı yığınının güven düzeyine eşit veya 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 tümüne internal (Friend Visual Basic'te) erişebilir. Kodunuzu içeren çağrı yığınında bayrağına yönelik bir talebin ReflectionPermission karşılanabilmesi koşuluyla, modülü oluşturup oluşturmadığınıza bakılmaksızın herhangi bir modülle RestrictedMemberAccess dinamik bir yöntem ilişkilendirebilirsiniz. Bayrağı verme işlemine ReflectionPermissionFlag.MemberAccess dahil edilirse, dinamik yöntem JIT derleyicisinin görünürlük denetimlerini atlayabilir ve modülde veya herhangi bir derlemedeki diğer modüllerde bildirilen tüm türlerin özel verilerine erişebilir.

    Not

    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. Dinamik bir yöntemi herhangi bir türle ilişkilendirebilirsiniz, ancak kodunuz hem hem MemberAccess de RestrictedMemberAccess bayraklarıyla verilmelidirReflectionPermission.

Aşağıdaki tabloda, bayrağın verilip verilmediğine bağlı olarak, anonim olarak barındırılan dinamik yöntem için hangi türlerin ve üyelerin RestrictedMemberAccess erişilebilir olduğu ve JIT görünürlüğü denetimleri olmadan ReflectionPermission gösterilmektedir.

Görünürlük denetimleri Olma -dan RestrictedMemberAccess Ile RestrictedMemberAccess
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 güven düzeyleri dinamik yöntemin yaydığı derlemenin güven düzeyine eşit veya ondan küçük olan derlemelerde.

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ır 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 iç üyeleri.

Herhangi bir derlemedeki ortak türlerin genel üyeleri.
Yes Herhangi bir derlemedeki tüm türlerin tüm üyeleri. Herhangi bir derlemedeki 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. Bunun yöntem aşırı yüklemesi için CreateDelegate(Type, Object) sağlandığını gösteren bir örnek.

Doğrulama

Aşağıdaki listede, dinamik yöntemlerin hangi koşullar altında uygun olmayan kod içerebileceği özetlemektedir. (Örneğin, özelliği olarak ayarlanırsa InitLocalsfalsedinamik bir yöntem 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 iyileştirilebilir 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. Güvenlik Saydam Kodu, Düzey 1.
  • Doğrulanamayan kod içeren dinamik bir yöntem düzey 2 saydamlığa (mscorlib.dll gibi) sahip bir derlemeyle ilişkiliyse, güvenlik talebi oluşturmak yerine bir özel durum oluşturur (JIT derleyicisi tarafından eklenir). Bkz. Güvenlik Saydam 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. Yönteminden CreateDelegate döndürülen bir temsilciyi kullanarak dinamik bir yöntem çağırırsanız, bir VerificationException oluşturulur. yöntemini kullanarak Invoke dinamik yöntemi çağırırsanız, bir iç VerificationExceptionile bir TargetInvocationException oluşturulur.