Aplikacijski scenariji z našo C# kodo dinamično generirajo EXE, scenariji uporabe so lahko zelo številni, kot so avtorizacija programske opreme, vnos avtorizacijskih informacij, generiranje pooblaščenega DLL-ja itd., zato moramo omeniti tehnični Emit.
1. Pregled Emit
Oddajanje lahko imenujemo oddajanje ali generiranje. V Frameworku razredi, povezani z Emitom, v bistvu obstajajo pod imenskim prostorom System.Reflection.Emit. Vidimo lahko, da Emit obstaja kot element refleksije. Kar zadeva refleksijo, bi moral biti vsakdo seznanjen z njo, saj nam omogoča ogled elementov sestave, s čimer pridobimo veliko informacij, kot so vrste sestave, katere metode vsebuje tip in podobno. Odsevi pa so lahko le 'vidni', medtem ko lahko Emit dinamično generira kodo med izvajanjem. Poglejmo, kako generirati kodo z Emitom.
2. Sestavljanje in upravljani modul
Sestava je logična skupina enega ali več modulov, datotek z viri, sekundarno pa je sestava najmanjša enota za ponovno uporabo, varnost in verzioniranje. DLL-ji in EXE-ji, ki jih vidimo, lahko imenujemo asembler, asembler vsebuje več modulov, vendar običajno, ko prevajamo VS, prevedemo le en modul; če želimo prevesti več modulov v asemblerju, moramo uporabiti csc.exe implementacijo.
3. Dinamično generiranje kodnih operacij
Najprej moramo razumeti, s kakšnim tipom je vsak dinamični tip predstavljen v .NET.
Sestavljanje: System.Reflection.Emit.AssemblBuilder (definira in predstavlja dinamične sestave)
Konstruktor: System.Reflection.Emit.ConstructorBuilder (konstruktor, ki definira in predstavlja dinamične razrede)
Lastni atribut: System.Reflection.Emit.CustomAttributeBuilder (pomaga generirati prilagojene atribute z uporabo parametrov, ki jih konstruktor posreduje za generiranje atributov za razrede)
Enum: System.Reflection.Emit.EnumBuilder (pojasnjuje in označuje tip enuma)
Dogodek: System.Reflection.Emit.EventBuilder (dogodek, ki definira razred)
Polje: System.Reflection.Emit.FieldBuilder (Definira in predstavlja polja.) takšnega razreda ne morejo podedovati)
Lokalne spremenljivke: System.Reflection.Emit.LocalBuilder (predstavlja lokalne spremenljivke znotraj metode ali konstruktorja)
Metoda: System.Reflection.Emit.MethodBuilder (metoda (ali konstruktor), ki definira in predstavlja dinamični razred)
Modul: System.Reflection.Emit.ModuleBuilder (definira in predstavlja module v dinamičnih sestavah)
Parameter: System.Reflection.Emit.ParameterBuilder (ustvari ali poveži informacije o parametrih, kot so parametri metode, parametri dogodkov itd.)
Lastnost: System.Reflection.Emit.PropertyBuilder (Določi vrsto nepremičnine)
Razred: System.Reflection.Emit.TypeBuilder (definiraj in ustvari novo instanco razreda med izvajanjem)
OpCode je opis direktive za vmesni jezik (IL). Za to je veliko navodil, lahko preverite uradno Microsoftovo spletno stran:Prijava do hiperpovezave je vidna.
Omejitve dostopa AssemblyBuilderAccess
AssemblyBuilderAccess.Run; Pomeni, da je mogoče sestavo izvediti, vendar ne shraniti. AssemblyBuilderAccess.Save; Pomeni, da je mogoče sestavo shraniti, vendar ne izvedeti. AssemblyBuilderAccess.RunAndSave; Označuje, da je mogoče asembler shraniti in zagnati. AssemblyBuilderAccess.ReflectionOnly; Označuje, da se sestave lahko uporabljajo le v refleksivnem kontekstu in jih ni mogoče izvajati. AssemblyBuilderAccess.RunAndCollect; Označuje, da je mogoče sklop razbremeniti in pomnilnik pridobiti nazaj.
Koda je naslednja:
Najprej uporabite emit za generiranje IL kode, nato dinamično ustvarite sestavljeno in na koncu naložite sestavo ter pokličite njene metode, kot je prikazano na spodnji sliki:
Uporabite ILSpy za ogled generirane kode, kot je prikazano na spodnji sliki:
(Konec)
|