Šis straipsnis yra veidrodinis mašininio vertimo straipsnis, spauskite čia norėdami pereiti prie originalaus straipsnio.

Rodinys: 50355|Atsakyti: 0

[Šaltinis] .NET/C# Išleidžia dinamiškai generuojamus rinkinius

[Kopijuoti nuorodą]
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 kompiliatoriaus
Kitą:.NET/C# atspindys, emisija, išraiškos našumo testavimas
Atsakomybės apribojimas:
Visa programinė įranga, programavimo medžiaga ar straipsniai, kuriuos skelbia Code Farmer Network, yra skirti tik mokymosi ir mokslinių tyrimų tikslams; Aukščiau nurodytas turinys negali būti naudojamas komerciniais ar neteisėtais tikslais, priešingu atveju vartotojai prisiima visas pasekmes. Šioje svetainėje pateikiama informacija gaunama iš interneto, o ginčai dėl autorių teisių neturi nieko bendra su šia svetaine. Turite visiškai ištrinti aukščiau pateiktą turinį iš savo kompiuterio per 24 valandas nuo atsisiuntimo. Jei jums patinka programa, palaikykite autentišką programinę įrangą, įsigykite registraciją ir gaukite geresnes autentiškas paslaugas. Jei yra kokių nors pažeidimų, susisiekite su mumis el. paštu.

Mail To:help@itsvse.com