Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
Artikel ini menyediakan keterangan tambahan untuk dokumentasi referensi untuk API ini.
Anda dapat menggunakan kelas DynamicMethod untuk menghasilkan dan menjalankan metode saat runtime, tanpa harus menghasilkan rakitan dinamis dan tipe dinamis untuk berisi metode tersebut. 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 kode dari pengompilasi JIT, jika telah diberikan ReflectionPermission dengan parameter ReflectionPermissionFlag.RestrictedMemberAccess. Tingkat kepercayaan rakitan yang anggota non-publiknya diakses oleh metode dinamis harus setara dengan, atau merupakan subset dari, tingkat kepercayaan tumpukan pemanggilan yang menghasilkan 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 tipe dalam modul dan semua anggota tipe
internal(Frienddi Visual Basic). Anda dapat mengaitkan metode dinamis dengan modul apa pun, terlepas dari apakah Anda membuat modul tersebut, asalkan permintaan untuk ReflectionPermission dengan parameter RestrictedMemberAccess dapat dipenuhi oleh tumpukan panggilan yang menyertakan kode Anda. ReflectionPermissionFlag.MemberAccess Jika flag 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 rakitan mana pun.Nota
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 flag RestrictedMemberAccess 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 flag RestrictedMemberAccess diberikan.
| Pemeriksaan visibilitas | Tanpa RestrictedMemberAccess |
Dengan RestrictedMemberAccess |
|---|---|---|
| Tanpa melewati pemeriksaan visibilitas JIT | Anggota publik dari jenis publik di rakitan apa pun. | Anggota publik dari jenis publik di rakitan apa pun. |
| Melompati pemeriksaan visibilitas JIT, dengan pembatasan | Anggota publik dari jenis publik di rakitan apa pun. | Semua anggota dari semua jenis, hanya dalam kumpulan dengan tingkat kepercayaan yang sama dengan atau kurang dari tingkat kepercayaan kumpulan yang memanggil 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 |
|---|---|---|
| Tidak. | Anggota publik dan internal dari jenis publik, internal, dan privat dalam modul. Anggota publik dari jenis publik di rakitan apa pun. |
Semua anggota jenis terkait. Anggota publik dan internal dari semua tipe lain dalam modul. Anggota publik dari jenis publik di rakitan apa pun. |
| Ya | Semua anggota dari semua jenis dalam majelis apa pun. | Semua anggota dari semua jenis dalam majelis 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 memberikan nama untuk membantu proses debugging. 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 KodeSecurity-Transparent, Tingkat 1.
- Jika metode dinamis yang berisi kode yang tidak dapat diverifikasi dikaitkan dengan rakitan yang memiliki transparansi tingkat 2 (seperti mscorlib.dll), itu melemparkan pengecualian (disuntikkan oleh pengkompilasi JIT) alih-alih membuat permintaan keamanan. Lihat KodeSecurity-Transparent, 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 metode CreateDelegate, VerificationException akan dilemparkan. Jika Anda memanggil metode dinamis dengan menggunakan metode Invoke, maka TargetInvocationException akan dilemparkan dengan bagian dalam VerificationException.