Aracılığıyla paylaş


OpCodes.Callvirt Alan

Tanım

Dönüş değerini değerlendirme yığınına göndererek bir nesne üzerinde geç bağlanan bir yöntemi çağırır.

public: static initonly System::Reflection::Emit::OpCode Callvirt;
public static readonly System.Reflection.Emit.OpCode Callvirt;
 staticval mutable Callvirt : System.Reflection.Emit.OpCode
Public Shared ReadOnly Callvirt As OpCode 

Alan Değeri

Açıklamalar

Aşağıdaki tabloda, yönergenin onaltılık ve Microsoft Ara Dil (MSIL) derleme biçiminin yanı sıra kısa bir başvuru özeti listelenmiştir:

Biçimlendir Derleme Biçimi Description
6F <T> Callvirt method ile objilişkili belirli bir yöntemi çağırır.

Sıralı sırada yığın geçiş davranışı şu şekildedir:

  1. Yığına bir nesne başvurusu obj gönderilir.

  2. aracılığıyla argN yöntem bağımsız değişkenleri arg1 yığına gönderilir.

  3. aracılığıyla argN yöntem bağımsız değişkenleri arg1 ve nesne başvurusu obj yığından çıkarılır; yöntem çağrısı bu bağımsız değişkenlerle gerçekleştirilir ve denetim yöntem meta veri belirteci tarafından başvuruda bulunılan yöntemine obj aktarılır. Tamamlandığında, çağıran yöntemi tarafından bir dönüş değeri oluşturulur ve çağırana gönderilir.

  4. Dönüş değeri yığına gönderilir.

Yönerge, callvirt bir nesne üzerinde geç bağlanan bir yöntemi çağırır. Başka bir ifadeyle yöntemi, yöntem işaretçisinde görünen derleme zamanı sınıfı yerine çalışma zamanı türüne obj göre seçilir. Callvirt hem sanal hem de örnek yöntemlerini çağırmak için kullanılabilir. Denetimi callvirt aktarmadan önce geçerli yığın çerçevesinin serbest bırakılacağını belirtmek için yönergeden hemen önce bir tail (Tailcall) ön eki eklenebilir. Çağrı denetimi özgün yöntemden daha yüksek bir güven yöntemine aktaracaksa yığın çerçevesi serbest bırakılmaz.

Yöntem meta veri belirteci çağrılacak yöntemin adını, sınıfını ve imzasını sağlar. ile obj ilişkilendirilmiş sınıf, örneği olduğu sınıfıdır. sınıfı belirtilen yöntem adı ve imzası ile eşleşen statik olmayan bir yöntem tanımlarsa, bu yöntem çağrılır. Aksi takdirde, bu sınıfın temel sınıf zincirindeki tüm sınıflar sırayla denetleniyor. Yöntem bulunamazsa bu bir hatadır.

Callvirt yöntemini çağırmadan önce nesnesini ve ilişkili bağımsız değişkenleri değerlendirme yığınından açar. Yöntemin dönüş değeri varsa, yöntem tamamlandıktan sonra yığına gönderilir. Çağıran tarafında, parametreye obj bağımsız değişken 0, arg1 bağımsız değişken 1 gibi erişilir.

Bağımsız değişkenler yığına soldan sağa sırayla yerleştirilir. Diğer bir ifadeyle, ilk bağımsız değişken hesaplanır ve yığına, ardından ikinci bağımsız değişkene, sonra da gerekli tüm bağımsız değişkenler yığının üstünde azalan sırada olana kadar üçüncü bağımsız değişkene yerleştirilir. Örnek başvurusu obj (için callvirther zaman gereklidir), kullanıcı tarafından görünen bağımsız değişkenlerden önce gönderilmelidir. İmzanın (meta veri belirtecinde taşınan) bu işaretçi için parametre listesinde bir girdi içermesi gerekmez.

Bir sanal yöntemin yönerge kullanılarak Call da çağrılabileceğini unutmayın.

MissingMethodException belirtilen ada ve imzaya sahip statik olmayan bir yöntem ile obj ilişkili sınıfta veya temel sınıflarından herhangi birinde bulunamazsa oluşturulur. Bu durum genellikle Microsoft Ara Dil (MSIL) yönergeleri çalışma zamanında değil yerel koda dönüştürüldüğünde algılanır.

NullReferenceException , obj null ise oluşturulur.

SecurityException sistem güvenliği çağırana çağrılan yönteme erişim vermezse oluşturulur. Güvenlik denetimi, CIL çalışma zamanında değil yerel koda dönüştürüldüğünde oluşabilir.

Not

Değer türlerinde System.Object yöntemlerini çağırırken yönergeyle constrained birlikte ön ekini callvirt kullanmayı göz önünde bulundurun. Bu, değer türünün yöntemi geçersiz kılıp geçersiz kılmadığına bağlı olarak farklı IL yayma gereksinimini ortadan kaldırarak olası bir sürüm oluşturma sorununu önler. Arabirim yöntemini uygulayan değer türü yöntemi kullanılarak MethodImpldeğiştirilebileceği için, değer türlerinde arabirim yöntemlerini çağırırken ön ekini kullanmayı constrained göz önünde bulundurun. Bu sorunlar, opcode'da Constrained daha ayrıntılı olarak açıklanmıştır.

Aşağıdaki Emit yöntem aşırı yüklemesi opcode'unu callvirt kullanabilir:

Şunlara uygulanır