Bahasa

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 Bahasa Perantara (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 dirujuk oleh deskriptor metode. Setelah selesai, nilai pengembalian dihasilkan oleh metode penerima panggilan dan dikirim ke pemanggil.

  3. Nilai pengembalian didorong ke tumpukan.

call Instruksi memanggil metode yang ditunjukkan oleh deskriptor 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 dirilis. 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 menurut. Ada tiga kasus khusus penting:

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

  2. Ini 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 disebut. Pemeriksaan keamanan dapat terjadi ketika instruksi Microsoft Intermediate Language (MSIL) dikonversi ke kode asli daripada pada waktu proses.

Note

Saat memanggil metode System.Object pada jenis nilai, pertimbangkan untuk constrained menggunakan 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, 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.

Overload metode berikut Emit dapat menggunakan call opcode:

Note

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

Berlaku untuk