Kelas System.Reflection.Emit.DynamicMethod

Artikel ini menyediakan keterangan tambahan untuk dokumentasi referensi untuk API ini.

Anda dapat menggunakan DynamicMethod kelas untuk menghasilkan dan menjalankan metode pada waktu proses, tanpa harus menghasilkan rakitan dinamis dan jenis dinamis untuk berisi metode . Kode yang dapat dieksekusi yang dibuat oleh kompilator just-in-time (JIT) diklaim kembali ketika DynamicMethod objek diklaim kembali. Metode dinamis adalah cara paling efisien untuk menghasilkan dan menjalankan sejumlah kecil kode.

Metode dinamis dapat dihosting secara anonim, atau dapat dikaitkan secara logis dengan modul atau dengan jenis.

  • Jika metode dinamis dihosting secara anonim, metode ini terletak di rakitan yang disediakan sistem, dan karenanya diisolasi dari kode lain. Secara default, ia tidak memiliki akses ke data non-publik apa pun. Metode dinamis yang dihosting secara anonim dapat memiliki kemampuan terbatas untuk melewati pemeriksaan visibilitas pengompilasi JIT, jika telah diberikan ReflectionPermission dengan ReflectionPermissionFlag.RestrictedMemberAccess bendera. Tingkat kepercayaan rakitan yang anggota non-publiknya diakses oleh metode dinamis harus sama dengan, atau subset, tingkat kepercayaan tumpukan panggilan yang memancarkan metode dinamis. Untuk informasi selengkapnya tentang metode dinamis yang dihosting secara anonim, lihat Panduan: Memancarkan Kode dalam Skenario Kepercayaan Parsial.

  • Jika metode dinamis dikaitkan dengan modul yang Anda tentukan, metode dinamis secara efektif bersifat global ke modul tersebut. Ini dapat mengakses semua jenis dalam modul dan semua internal (Friend di Visual Basic) anggota jenis. Anda dapat mengaitkan metode dinamis dengan modul apa pun, terlepas dari apakah Anda membuat modul, asalkan permintaan dengan ReflectionPermissionRestrictedMemberAccess bendera dapat dipenuhi oleh tumpukan panggilan yang menyertakan kode Anda. ReflectionPermissionFlag.MemberAccess Jika bendera disertakan dalam pemberian, metode dinamis dapat melewati pemeriksaan visibilitas pengkompilasi JIT dan mengakses data privat dari semua jenis yang dideklarasikan dalam modul atau dalam modul lain di perakitan apa pun.

    Catatan

    Ketika Anda menentukan modul tempat metode dinamis dikaitkan, modul tersebut tidak boleh berada di rakitan yang disediakan sistem yang digunakan untuk hosting anonim.

  • Jika metode dinamis dikaitkan dengan jenis yang Anda tentukan, metode ini memiliki akses ke semua anggota jenis, terlepas dari tingkat akses. Selain itu, pemeriksaan visibilitas JIT dapat dilewati. Ini memberikan akses metode dinamis ke data privat dari jenis lain yang dideklarasikan dalam modul yang sama atau dalam modul lain di perakitan apa pun. Anda dapat mengaitkan metode dinamis dengan jenis apa pun, tetapi kode Anda harus diberikan ReflectionPermission dengan RestrictedMemberAccess bendera dan MemberAccess .

Tabel berikut menunjukkan jenis dan anggota mana yang dapat diakses oleh metode dinamis yang dihosting secara anonim, dengan dan tanpa pemeriksaan visibilitas JIT, tergantung pada apakah ReflectionPermission dengan RestrictedMemberAccess bendera diberikan.

Pemeriksaan visibilitas Tanpa RestrictedMemberAccess Dengan RestrictedMemberAccess
Tanpa melewati pemeriksaan visibilitas JIT Anggota publik jenis publik di rakitan apa pun. Anggota publik jenis publik di rakitan apa pun.
Melewati pemeriksaan visibilitas JIT, dengan pembatasan Anggota publik jenis publik di rakitan apa pun. Semua anggota dari semua jenis, hanya dalam rakitan yang tingkat kepercayaannya sama dengan atau kurang dari tingkat kepercayaan rakitan yang memancarkan metode dinamis.

Tabel berikut menunjukkan jenis dan anggota mana yang dapat diakses oleh metode dinamis yang terkait dengan modul atau dengan jenis dalam modul.

Lewati pemeriksaan visibilitas JIT Terkait dengan modul Terkait dengan jenis
No Anggota publik dan internal dari jenis publik, internal, dan privat dalam modul.

Anggota publik jenis publik di rakitan apa pun.
Semua anggota jenis terkait. Anggota publik dan internal dari semua jenis lain dalam modul.

Anggota publik jenis publik di rakitan apa pun.
Ya Semua anggota dari semua jenis dalam rakitan apa pun. Semua anggota dari semua jenis dalam rakitan apa pun.

Metode dinamis yang terkait dengan modul memiliki izin modul tersebut. Metode dinamis yang terkait dengan jenis memiliki izin modul yang berisi jenis tersebut.

Metode dinamis dan parameternya tidak harus dinamai, tetapi Anda dapat menentukan nama untuk membantu penelusuran kesalahan. Atribut kustom tidak didukung pada metode dinamis atau parameternya.

Meskipun metode dinamis adalah static metode (Shared metode di Visual Basic), aturan yang dilonggarkan untuk pengikatan delegasi memungkinkan metode dinamis terikat ke objek, sehingga bertindak seperti metode instans saat dipanggil menggunakan instans delegasi tersebut. Contoh yang menunjukkan ini disediakan untuk CreateDelegate(Type, Object) metode kelebihan beban.

Verifikasi

Daftar berikut ini meringkas kondisi di mana metode dinamis dapat berisi kode yang tidak dapat diverifikasi. (Misalnya, metode dinamis tidak dapat diverifikasi jika propertinya InitLocals diatur ke false.)

  • Metode dinamis yang terkait dengan rakitan penting keamanan juga penting bagi keamanan, dan dapat melewati verifikasi. Misalnya, rakitan tanpa atribut keamanan yang dijalankan sebagai aplikasi desktop diperlakukan sebagai kritis keamanan oleh runtime. Jika Anda mengaitkan metode dinamis dengan rakitan, metode dinamis dapat berisi kode yang tidak dapat diverifikasi.
  • Jika metode dinamis yang berisi kode yang tidak dapat diverifikasi dikaitkan dengan rakitan yang memiliki transparansi tingkat 1, kompilator just-in-time (JIT) menyuntikkan permintaan keamanan. Permintaan hanya berhasil jika metode dinamis dijalankan oleh kode yang sepenuhnya tepercaya. Lihat Kode Transparan Keamanan, Tingkat 1.
  • Jika metode dinamis yang berisi kode yang tidak dapat diverifikasi dikaitkan dengan rakitan yang memiliki transparansi tingkat 2 (seperti mscorlib.dll), itu melempar pengecualian (disuntikkan oleh kompilator JIT) alih-alih membuat permintaan keamanan. Lihat Kode Transparan Keamanan, Tingkat 2.
  • Metode dinamis yang dihosting secara anonim yang berisi kode yang tidak dapat diverifikasi selalu memberikan pengecualian. Ini tidak pernah dapat melewati verifikasi, bahkan jika dibuat dan dijalankan oleh kode yang sepenuhnya tepercaya.

Pengecualian yang dilemparkan untuk kode yang tidak dapat diverifikasi bervariasi tergantung pada cara metode dinamis dipanggil. Jika Anda memanggil metode dinamis dengan menggunakan delegasi yang dikembalikan dari CreateDelegate metode , VerificationException akan dilemparkan. Jika Anda memanggil metode dinamis dengan menggunakan Invoke metode , dilemparkan TargetInvocationException dengan bagian dalam VerificationException.