Bagikan melalui


OpCodes.Call Bidang

Definisi

Memanggil metode yang ditunjukkan oleh deskriptor metode yang diteruskan.

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

Nilai Bidang

Keterangan

Tabel berikut mencantumkan format rakitan heksadesimal dan Microsoft Intermediate Language (MSIL) instruksi, bersama dengan ringkasan referensi singkat:

Format Format Rakitan Deskripsi
28 <T> Panggilan methodDesc Panggil metode yang dijelaskan oleh methodDesc.

Perilaku transisi tumpukan, dalam urutan berurutan, adalah:

  1. Argumen metode arg1 melalui argN didorong ke tumpukan.

  2. Argumen metode arg1 melalui argN muncul dari tumpukan; panggilan metode dilakukan dengan argumen dan kontrol ini ditransfer ke metode yang disebutkan oleh deskriptor metode. Setelah selesai, nilai yang dikembalikan dihasilkan oleh metode penerima panggilan dan dikirim ke pemanggil.

  3. Nilai yang dikembalikan didorong ke tumpukan.

call Instruksi memanggil metode yang ditunjukkan oleh pendeskripsi metode yang diteruskan dengan instruksi. Deskriptor metode adalah token metadata yang menunjukkan metode untuk memanggil dan nomor, jenis, dan urutan argumen yang telah ditempatkan pada tumpukan untuk diteruskan ke metode tersebut serta konvensi panggilan yang akan digunakan. call Instruksi dapat segera didahului oleh tail instruksi awalan (Tailcall) untuk menentukan bahwa status metode saat ini harus dirilis sebelum mentransfer kontrol. Jika panggilan mentransfer kontrol ke metode kepercayaan yang lebih tinggi daripada metode asal, bingkai tumpukan tidak dilepaskan. Sebaliknya, eksekusi berlanjut secara diam-diam tail seolah-olah belum disediakan. Token metadata membawa informasi yang memadai untuk menentukan apakah panggilan ke metode statis, metode instans, metode virtual, atau fungsi global. Dalam semua kasus ini, alamat tujuan ditentukan sepenuhnya dari deskriptor metode (berbeda dengan Callvirt instruksi untuk memanggil metode virtual, di mana alamat tujuan juga tergantung pada jenis runtime referensi instans yang didorong sebelum Callvirt).

Argumen ditempatkan pada tumpukan dalam urutan kiri-ke-kanan. Artinya, argumen pertama dihitung dan ditempatkan pada tumpukan, kemudian argumen kedua, kemudian argumen ketiga, sampai semua argumen yang diperlukan berada di atas tumpukan dalam urutan menurung. Ada tiga kasus khusus penting:

  1. Panggilan ke metode instans (atau virtual) harus mendorong referensi instans tersebut sebelum argumen yang terlihat pengguna. Referensi instans tidak boleh berupa referensi null. Tanda tangan yang dibawa dalam metadata tidak berisi entri dalam daftar parameter untuk this penunjuk; sebaliknya, tanda tangan menggunakan sedikit untuk menunjukkan apakah metode memerlukan melewati this penunjuk.

  2. Valid untuk memanggil metode virtual menggunakan call (bukan callvirt); ini menunjukkan bahwa metode akan diselesaikan menggunakan kelas yang ditentukan oleh metode daripada yang ditentukan secara dinamis dari objek yang dipanggil.

  3. Perhatikan bahwa metode delegasi Invoke dapat dipanggil dengan call instruksi atau callvirt .

SecurityException dapat dilemparkan jika keamanan sistem tidak memberikan akses pemanggil ke metode yang dipanggil. Pemeriksaan keamanan dapat terjadi ketika instruksi Microsoft Intermediate Language (MSIL) dikonversi ke kode asli daripada pada durasi.

Catatan

Saat memanggil metode System.Object pada jenis nilai, pertimbangkan untuk menggunakan constrained awalan dengan callvirt instruksi alih-alih memancarkan call instruksi. Ini menghapus kebutuhan untuk memancarkan IL yang berbeda tergantung pada apakah jenis nilai mengambil alih metode atau tidak, menghindari potensi masalah penerapan versi. Pertimbangkan untuk menggunakan awalan constrained saat memanggil metode antarmuka pada jenis nilai, karena metode jenis nilai yang mengimplementasikan metode antarmuka dapat diubah menggunakan MethodImpl. Masalah-masalah ini dijelaskan secara lebih rinci dalam Constrained opcode.

Metode overload berikut Emit dapat menggunakan call opcode:

Catatan

Metode EmitCall ini disediakan untuk varargs panggilan. Emit Gunakan metode untuk panggilan normal.

Berlaku untuk