|
|
Publikuota: 2021-3-21 12:38:34
|
|
|
|

Taikymo scenarijai pagal mūsų C# kodą dinamiškai generuoja EXE, jo taikymo scenarijų gali būti labai daug, pvz., programinės įrangos autorizacija, galite įvesti autorizacijos informaciją, sugeneruoti įgaliotą DLL ir kt., Taigi, kaip pasiekti šią funkciją, turime paminėti techninį emisiją.
1. Emisijos apžvalga
Skleisti, gali būti vadinamas skleidžiančiu arba generuojančiu. "Framework" klasės, susijusios su "Emit", iš esmės egzistuoja pagal "System.Reflection.Emit" vardų sritį. Galima pastebėti, kad "Emit" egzistuoja kaip atspindžio elementas. Kalbant apie atspindį, visi turėtų būti su juo susipažinę, tai leidžia mums peržiūrėti surinkimo elementus, kad gautume daug informacijos, pavyzdžiui, kokie tipai yra rinkinyje, kokie metodai yra tipe ir pan. Tačiau atspindžiai gali būti tik "matomi", o "Emit" gali dinamiškai generuoti kodą vykdymo metu. Pažvelkime, kaip generuoti kodą naudojant "Emit".
2. Surinkimas ir valdomas modulis
Rinkinys yra logiškas vieno ar kelių modulių, išteklių failų grupavimas, o antrinis rinkinys yra mažiausias pakartotinio naudojimo, saugos ir versijų kūrimo vienetas. Matomi DLL ir EXE gali būti vadinami asamblėja, rinkinyje yra keli moduliai, tačiau paprastai, kai kompiliuojame VS, kompiliuojame tik vieną modulį, jei norime surinkti kelis modulius asamblėjoje, turime naudoti csc.exe įgyvendinimą.
3. Dinamiškai generuokite kodo operacijas
Pirmiausia turime suprasti, kokio tipo kiekvienas dinaminis tipas yra .NET.
Surinkimas: System.Reflection.Emit.AssemblyBuilder (apibrėžia ir atspindi dinaminius rinkinius)
Konstruktorius: System.Reflection.Emit.ConstructorBuilder (konstruktorius, apibrėžiantis ir vaizduojantis dinamines klases)
Pasirinktinis atributas: System.Reflection.Emit.CustomAttributeBuilder (padeda generuoti pasirinktinius atributus naudojant konstruktoriaus perduotus parametrus, kad generuotų klasių atributus)
Išvardijimas: System.Reflection.Emit.EnumBuilder (paaiškina ir nurodo išvardijimo tipą)
Įvykis: System.Reflection.Emit.EventBuilder (įvykis, apibrėžiantis klasę)
Laukas: System.Reflection.Emit.FieldBuilder (apibrėžia ir vaizduoja laukus.) negali paveldėti tokios klasės)
Vietiniai kintamieji: System.Reflection.Emit.LocalBuilder (nurodo vietinius kintamuosius metode arba konstruktoriuje)
Metodas: System.Reflection.Emit.MethodBuilder (metodas (arba konstruktorius), apibrėžiantis ir atspindintis dinaminę klasę)
Modulis: System.Reflection.Emit.ModuleBuilder (apibrėžia ir vaizduoja modulius dinaminiuose mazguose)
Parametras: System.Reflection.Emit.ParameterBuilder (kurti arba susieti parametrų informaciją, pvz., metodo parametrus, įvykio parametrus ir kt.)
Ypatybė: System.Reflection.Emit.PropertyBuilder (Apibrėžkite ypatybės tipą)
Klasė: System.Reflection.Emit.TypeBuilder (apibrėžkite ir sukurkite naują klasės egzempliorių vykdymo metu)
OpCode yra tarpinės kalbos (IL) direktyvos aprašymas. Tam yra daugybė instrukcijų, galite patikrinti oficialią "Microsoft" svetainę:Hipersaito prisijungimas matomas.
AssemblyBuilderAccess prieigos apribojimai
AssemblyBuilderAccess.Run; Nurodo, kad rinkinį galima vykdyti, bet neįrašyti. AssemblyBuilderAccess.Save; Nurodo, kad rinkinį galima įrašyti, bet nevykdyti. AssemblyBuilderAccess.RunAndSave; Nurodo, kad rinkinį galima įrašyti ir vykdyti. AssemblyBuilderAccess.ReflectionOnly; Nurodo, kad rinkiniai gali būti naudojami tik atspindinčiame kontekste ir negali būti vykdomi. AssemblyBuilderAccess.RunAndCollect; Nurodo, kad mazgą galima iškrauti ir atgauti atmintį.
Kodas yra toks:
Pirmiausia naudokite emit, kad sugeneruotumėte IL kodą, tada dinamiškai sugeneruokite rinkinį ir galiausiai įkelkite rinkinį ir iškvieskite jo metodus, kaip parodyta paveikslėlyje žemiau:
Naudokite ILSpy, kad peržiūrėtumėte sugeneruotą kodą, kaip parodyta paveikslėlyje žemiau:
(Pabaiga)
|
Ankstesnis:Skirtumas tarp Roslyn MSBuild kompiliatoriausKitą:.NET/C# atspindys, emisija, išraiškos našumo testavimas
|