Scenariile de aplicație, conform codului nostru C#, generează dinamic un EXE, scenariile sale de aplicație pot fi foarte multe, cum ar fi autorizarea software, poți introduce informațiile de autorizare, genera un DLL autorizat etc., așa că cum să realizezi această funcție, trebuie să menționăm un Emit tehnic.
1. Prezentare generală a Emit
Emiterea poate fi numită emitere sau generatoare. În Framework, clasele legate de Emit există practic sub spațiul de nume System.Reflection.Emit. Se poate observa că Emit există ca un element de reflexie. Vorbind despre reflecție, toată lumea ar trebui să fie familiarizată cu ea, ne permite să vedem elementele asamblării, astfel încât să obținem o cantitate mare de informații, cum ar fi ce tipuri conține asamblarea, ce metode conține tipul și așa mai departe. Dar reflexiile pot fi doar "văzute", în timp ce Emit poate genera cod dinamic la rulare. Să aruncăm o privire asupra modului în care se generează cod cu Emit.
2. Modul de asamblare și gestionat
O asamblare este o grupare logică a unuia sau mai multor module, fișiere de resurse, iar pe de altă parte, o asamblare este cea mai mică unitate de reutilizare, securitate și versiune. DLL-urile și EXE-urile pe care le vedem pot fi numite assembly, un assembly conține mai multe module, dar de obicei, când compilam VS, compilăm doar un singur modul; dacă vrem să compilăm mai multe module într-un assembly, trebuie să folosim csc.exe implementare.
3. Generarea dinamică a operațiunilor de cod
Mai întâi, trebuie să înțelegem prin ce tip este reprezentat fiecare tip dinamic în .NET.
Assembly: System.Reflection.Emit.AssemblyBuilder (definește și reprezintă ansamblurile dinamice)
Constructor: System.Reflection.Emit.ConstructorBuilder (un constructor care definește și reprezintă clase dinamice)
Atribut personalizat: System.Reflection.Emit.CustomAttributeBuilder (ajută la generarea de atribute personalizate folosind parametrii trimiși de constructor pentru a genera atribute pentru clase)
Enum: System.Reflection.Emit.EnumBuilder (explică și indică tipul enum)
Eveniment: System.Reflection.Emit.EventBuilder (eveniment care definește clasa)
Câmp: System.Reflection.Emit.FieldBuilder (Definește și reprezintă câmpurile.) nu poate moșteni o astfel de clasă)
Variabile locale: System.Reflection.Emit.LocalBuilder (reprezintă variabilele locale dintr-o metodă sau constructor)
Metodă: System.Reflection.Emit.MethodBuilder (o metodă (sau constructor) care definește și reprezintă o clasă dinamică)
Modul: System.Reflection.Emit.ModuleBuilder (definește și reprezintă modulele în ansamblurile dinamice)
Parametru: System.Reflection.Emit.ParameterBuilder (creează sau asociază informații de parametri precum parametri de metodă, parametri de eveniment etc.)
Proprietate: System.Reflection.Emit.PropertyBuilder (Definiți tipul proprietății)
Clasă: System.Reflection.Emit.TypeBuilder (definește și creează o nouă instanță a clasei la rulare)
OpCode este o descriere a unei directive de limbaj intermediar (IL). Există multe instrucțiuni pentru asta, poți verifica site-ul oficial Microsoft:Autentificarea cu hyperlink este vizibilă.
Restricții de acces AssemblyBuilderAccess
AssemblyBuilderAccess.Run; Indică faptul că asamblarea poate fi executată, dar nu salvată. AssemblyBuilderAccess.Save; Indică faptul că asamblarea poate fi salvată, dar nu executată. AssemblyBuilderAccess.RunAndSave; Indică faptul că asamblarea poate fi salvată și executată. AssemblyBuilderAccess.ReflectionOnly; Indică faptul că asamblările pot fi folosite doar într-un context reflexiv și nu pot fi executate. AssemblyBuilderAccess.RunAndCollect; Indică faptul că asamblarea poate fi descărcată și memoria este recuperată.
Codul este următorul:
Mai întâi, folosește emit pentru a genera cod IL, apoi generează dinamic un ansamblu și, în final, încarcă asamblarea și apelează metodele sale, așa cum se arată în figura de mai jos:
Folosește ILSpy pentru a vizualiza codul generat, așa cum este prezentat în imaginea de mai jos:
(Sfârșit)
|