|
|
Dipaparkan pada 2021-3-21 12:38:34
|
|
|
|

Skenario aplikasi, dengan kode C# kami, secara dinamis menghasilkan EXE, skenario aplikasinya bisa sangat banyak, seperti otorisasi perangkat lunak, Anda dapat memasukkan informasi otorisasi, menghasilkan DLL resmi, dll., Jadi bagaimana mencapai fungsi ini, kita harus menyebutkan Emit teknis.
1. Sekilas Tentang Emit
Emit, bisa disebut emitting atau generating. Dalam Framework, kelas yang terkait dengan Emit pada dasarnya ada di bawah namespace System.Reflection.Emit. Dapat dilihat bahwa Emit ada sebagai elemen refleksi. Berbicara tentang refleksi, setiap orang harus terbiasa dengannya, ini memungkinkan kita untuk melihat elemen-elemen perakitan, sehingga dapat memperoleh sejumlah besar informasi seperti jenis apa yang terkandung dalam rakitan, metode apa yang terkandung dalam jenisnya, dan sebagainya. Tetapi refleksi hanya dapat 'dilihat', sementara Emit dapat menghasilkan kode secara dinamis saat runtime. Mari kita lihat cara menghasilkan kode dengan Emit.
2. Perakitan dan Modul Terkelola
Rakitan adalah pengelompokan logis dari satu atau beberapa modul, file sumber daya, dan rakitan kedua adalah unit terkecil dari penggunaan kembali, keamanan, dan penerapan versi. DLL dan EXE yang kita lihat dapat disebut assembly, assembly berisi beberapa modul, tetapi biasanya, ketika kita VS mengkompilasi, kita hanya akan mengkompilasi satu modul, jika kita ingin mengkompilasi beberapa modul dalam rakitan, kita perlu menggunakan implementasi csc.exe.
3. Menghasilkan operasi kode secara dinamis
Pertama, kita perlu memahami jenis apa yang diwakili oleh setiap jenis dinamis di .NET.
Perakitan: System.Reflection.Emit.AssemblyBuilder (mendefinisikan dan mewakili rakitan dinamis)
Konstruktor: System.Reflection.Emit.ConstructorBuilder (konstruktor yang mendefinisikan dan mewakili kelas dinamis)
Atribut Kustom: System.Reflection.Emit.CustomAttributeBuilder (membantu menghasilkan atribut kustom menggunakan parameter yang diteruskan oleh konstruktor untuk menghasilkan atribut untuk kelas)
Enum: System.Reflection.Emit.EnumBuilder (menjelaskan dan menunjukkan jenis enum)
Peristiwa: System.Reflection.Emit.EventBuilder (peristiwa yang menentukan kelas)
Bidang: System.Reflection.Emit.FieldBuilder (Mendefinisikan dan mewakili bidang.) tidak dapat mewarisi kelas seperti itu)
Variabel lokal: System.Reflection.Emit.LocalBuilder (mewakili variabel lokal dalam metode atau konstruktor)
Metode: System.Reflection.Emit.MethodBuilder (metode (atau konstruktor) yang mendefinisikan dan mewakili kelas dinamis)
Modul: System.Reflection.Emit.ModuleBuilder (mendefinisikan dan mewakili modul dalam rakitan dinamis)
Parameter: System.Reflection.Emit.ParameterBuilder (membuat atau mengaitkan informasi parameter seperti parameter metode, parameter peristiwa, dll.)
Properti: System.Reflection.Emit.PropertyBuilder (Menentukan jenis properti)
Kelas: System.Reflection.Emit.TypeBuilder (tentukan dan buat instans baru kelas saat runtime)
OpCode adalah deskripsi dari arahan bahasa perantara (IL). Ada banyak instruksi untuk ini, Anda dapat memeriksa situs web resmi Microsoft:Login hyperlink terlihat.
AssemblyBuilderPembatasan akses akses
AssemblyBuilderAccess.Run; Menunjukkan bahwa rakitan dapat dieksekusi, tetapi tidak disimpan. AssemblyBuilderAccess.Save; Menunjukkan bahwa rakitan dapat disimpan, tetapi tidak dieksekusi. AssemblyBuilderAccess.RunAndSave; Menunjukkan bahwa rakitan dapat disimpan dan dieksekusi. AssemblyBuilderAccess.ReflectionOnly; Menunjukkan bahwa rakitan hanya dapat digunakan dalam konteks reflektif dan tidak dapat dieksekusi. AssemblyBuilderAccess.RunAndCollect; Menunjukkan bahwa rakitan dapat dibongkar dan memori direklamasi.
Kodenya adalah sebagai berikut:
Pertama, gunakan emit untuk menghasilkan kode IL, kemudian, hasilkan rakitan secara dinamis, dan terakhir, muat rakitan dan panggil metodenya, seperti yang ditunjukkan pada gambar di bawah ini:
Gunakan ILSpy untuk melihat kode yang dihasilkan seperti yang ditunjukkan pada gambar di bawah ini:
(Akhir)
|
Mantan:Perbedaan antara kompiler Roslyn MSBuildDepan:Pengujian performa Refleksi, Emitsi, Ekspresi .NET/C#
|