OpCodes.Call Bidang
Definisi
Penting
Beberapa informasi terkait produk prarilis yang dapat diubah secara signifikan sebelum dirilis. Microsoft tidak memberikan jaminan, tersirat maupun tersurat, sehubungan dengan informasi yang diberikan di sini.
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:
Argumen metode
arg1
melaluiargN
didorong ke tumpukan.Argumen metode
arg1
melaluiargN
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.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:
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 melewatithis
penunjuk.Valid untuk memanggil metode virtual menggunakan
call
(bukancallvirt
); ini menunjukkan bahwa metode akan diselesaikan menggunakan kelas yang ditentukan oleh metode daripada yang ditentukan secara dinamis dari objek yang dipanggil.Perhatikan bahwa metode delegasi
Invoke
dapat dipanggil dengancall
instruksi ataucallvirt
.
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.