See artikkel on masintõlke peegelartikkel, palun klõpsake siia, et hüpata algse artikli juurde.

Vaade: 50355|Vastuse: 0

[Allikas] .NET/C# Emit genereerib dünaamiliselt kokkupanekuid

[Kopeeri link]
Postitatud 2021-3-21 12:38:34 | | | |
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)





Eelmine:Erinevus Roslyn MSBuild kompilaatori vahel
Järgmine:.NET/C# Peegeldus-, emissiooni- ja väljendustestimine
Disclaimer:
Kõik Code Farmer Networki poolt avaldatud tarkvara, programmeerimismaterjalid või artiklid on mõeldud ainult õppimiseks ja uurimistööks; Ülaltoodud sisu ei tohi kasutada ärilistel ega ebaseaduslikel eesmärkidel, vastasel juhul kannavad kasutajad kõik tagajärjed. Selle saidi info pärineb internetist ning autoriõiguste vaidlused ei ole selle saidiga seotud. Ülaltoodud sisu tuleb oma arvutist täielikult kustutada 24 tunni jooksul pärast allalaadimist. Kui sulle programm meeldib, palun toeta originaaltarkvara, osta registreerimist ja saa paremaid ehtsaid teenuseid. Kui esineb rikkumist, palun võtke meiega ühendust e-posti teel.

Mail To:help@itsvse.com