Rakendusstsenaariumid, meie C# koodi järgi, genereerivad dünaamiliselt EXE, selle rakendusstsenaariume võib olla väga palju, näiteks tarkvara autoriseerimis, autoriseerimise info sisestamine, volitatud DLL-i genereerimine jne, nii et selle funktsiooni saavutamiseks tuleb mainida tehniline emissioon.
1. Emit'i ülevaade
Kiirgamist võib nimetada kiirgamiseks või genereerivaks. Frameworkis eksisteerivad Emitiga seotud klassid põhimõtteliselt System.Reflection.Emit nimeruumis. On näha, et Emit eksisteerib peegelduse elemendina. Rääkides peegeldusest, peaks kõik sellega tuttavad olema, see võimaldab meil vaadata kokkupaneku elemente, et saada suures koguses teavet, näiteks milliseid tüüpe kokkupanek sisaldab, milliseid meetodeid tüüp sisaldab jne. Kuid peegeldusi saab ainult 'näha', samas kui Emit saab dünaamiliselt genereerida koodi käitusajal. Vaatame, kuidas Emiti abil koodi genereerida.
2. Kokkupanek ja hallatav moodul
Assamblee on loogiline rühmitus ühest või mitmest moodulist, ressursifailidest ning teiseks on assamblee väikseim taaskasutuse, turvalisuse ja versioonistamise ühik. Näeme DLL-e ja EXE-sid, mida näeme, võib nimetada assambleeks, assamblees on mitu moodulit, kuid tavaliselt, kui me VS kompileerime, kompileerime ainult ühe mooduli, kui tahame kompileerida mitut moodulit assamblees, peame kasutama csc.exe rakendust.
3. Dünaamiliselt genereeri kooditoiminguid
Esiteks peame mõistma, millist tüüpi iga dünaamiline tüüp .NET-is esindab.
Assembly: System.Reflection.Emit.AssemblyBuilder (määratleb ja esindab dünaamilisi kokkupanekuid)
Konstruktor: System.Reflection.Emit.ConstructorBuilder (konstruktor, mis määratleb ja esindab dünaamilisi klasse)
Kohandatud atribuut: System.Reflection.Emit.CustomAttributeBuilder (aitab genereerida kohandatud atribuute, kasutades konstruktori poolt antud parameetreid klasside atribuutide genereerimiseks)
Enum: System.Reflection.Emit.EnumBuilder (selgitab ja näitab enumi tüüpi)
Sündmus: System.Reflection.Emit.EventBuilder (sündmus, mis määratleb klassi)
Väli: System.Reflection.Emit.FieldBuilder (Määratleb ja esindab välju.) sellist klassi ei saa pärida)
Kohalikud muutujad: System.Reflection.Emit.LocalBuilder (esindab lokaalseid muutujaid meetodis või konstruktoris)
Meetod: System.Reflection.Emit.MethodBuilder (meetod (või konstruktor), mis määratleb ja esindab dünaamilist klassi)
Moodul: System.Reflection.Emit.ModuleBuilder (defineerib ja esindab mooduleid dünaamilistes kokkupanekutes)
Parameeter: System.Reflection.Emit.ParameterBuilder (loo või seostab parameetrite infot, nagu meetodi parameetrid, sündmuse parameetrid jne)
Omadus: System.Reflection.Emit.PropertyBuilder (Määra omaduse tüüp)
Klass: System.Reflection.Emit.TypeBuilder (defineeri ja loo klassi uus eksemplar käitusajal)
OpCode on kirjeldus vahekeele (IL) direktiivist. Selleks on palju juhiseid, võid vaadata ametlikku Microsofti veebilehte:Hüperlingi sisselogimine on nähtav.
AssemblyBuilderAccess juurdepääsu piirangud
AssemblyBuilderAccess.Run; Näitab, et kokkupanekut saab täita, kuid mitte salvestada. AssemblyBuilderAccess.Save; Näitab, et kokkupanekut saab salvestada, kuid mitte täita. AssemblyBuilderAccess.RunAndSave; Näitab, et kokkupanekut saab salvestada ja käivitada. AssemblyBuilderAccess.ReflectionOnly; Näitab, et assemble'e saab kasutada ainult reflektiivses kontekstis ja neid ei saa täita. AssemblyBuilderAccess.RunAndCollect; Näitab, et komplekt saab tühjendada ja mälu taastada.
Kood on järgmine:
Esmalt kasuta emit'i IL-koodi genereerimiseks, seejärel dünaamiliselt genereerida assamblee ja lõpuks laadida assamblee ning kutsuda selle meetodid, nagu alloleval joonisel näidatud:
Kasuta ILSpyt, et vaadata genereeritud koodi, nagu alloleval pildil näidatud:
(Lõpp)
|