|
|
Zverejnené 2021-3-21 12:38:34
|
|
|
|

Aplikačné scenáre v našom C# kóde dynamicky generujú EXE, jeho aplikačné scenáre môžu byť veľmi rôzne, napríklad autorizácia softvéru, môžete zadať autorizačné informácie, vygenerovať autorizovaný DLL a podobne, takže ako túto funkciu dosiahnuť, musíme spomenúť technický Emit.
1. Prehľad Emit
Emit, môže byť nazývaný vyžarujúci alebo generujúci. V Frameworku triedy súvisiace s Emit v podstate existujú pod menným priestorom System.Reflection.Emit. Je vidieť, že Emit existuje ako prvok reflexie. Keď už hovoríme o reflexii, každý by s ňou mal byť oboznámený, umožňuje nám vidieť prvky zostavenia, aby sme získali veľké množstvo informácií, ako napríklad aké typy zostava obsahuje, aké metódy typ obsahuje a podobne. Reflexie však môžu byť len "viditeľné", zatiaľ čo Emit dokáže dynamicky generovať kód za behu. Pozrime sa, ako generovať kód pomocou Emitu.
2. Montáž a riadený modul
Zostava je logické zoskupenie jedného alebo viacerých modulov, súborov zdrojov a sekundárne je zostava najmenšou jednotkou na opätovné použitie, bezpečnosť a verzovanie. DLL a EXE, ktoré vidíme, možno nazvať assembler, assembly obsahuje viacero modulov, ale zvyčajne, keď kompilujeme VS, kompilujeme len jeden modul, ak chceme kompilovať viacero modulov v assembleri, musíme použiť csc.exe implementáciu.
3. Dynamicky generovať kódové operácie
Najprv musíme pochopiť, akým typom je každý dynamický typ reprezentovaný v .NET.
Assembly: System.Reflection.Emit.AssemblyBuilder (definuje a reprezentuje dynamické assemblies)
Konštruktor: System.Reflection.Emit.ConstructorBuilder (konštruktor, ktorý definuje a reprezentuje dynamické triedy)
Vlastný atribút: System.Reflection.Emit.CustomAttributeBuilder (pomáha generovať vlastné atribúty pomocou parametrov odovzdaných konštruktorom na generovanie atribútov pre triedy)
Enum: System.Reflection.Emit.EnumBuilder (vysvetľuje a označuje typ enuma)
Udalosť: System.Reflection.Emit.EventBuilder (udalosť, ktorá definuje triedu)
Pole: System.Reflection.Emit.FieldBuilder (Definuje a reprezentuje polia.) takúto triedu nemôžu zdediť)
Lokálne premenné: System.Reflection.Emit.LocalBuilder (reprezentuje lokálne premenné v rámci metódy alebo konštruktora)
Metóda: System.Reflection.Emit.MethodBuilder (metóda (alebo konštruktor), ktorý definuje a reprezentuje dynamickú triedu)
Modul: System.Reflection.Emit.ModuleBuilder (definuje a reprezentuje moduly v dynamických zostavách)
Parameter: System.Reflection.Emit.ParameterBuilder (vytvoriť alebo priradiť informácie o parametroch ako parametre metódy, parametre udalostí a pod.)
Vlastnosť: System.Reflection.Emit.PropertyBuilder (Definujte typ nehnuteľnosti)
Trieda: System.Reflection.Emit.TypeBuilder (definuj a vytvor novú inštanciu triedy za behu)
OpCode je popis direktívy pre medziľahlý jazyk (IL). Existuje veľa návodov, môžete si pozrieť oficiálnu stránku Microsoftu:Prihlásenie na hypertextový odkaz je viditeľné.
Obmedzenia prístupu AssemblyBuilderAccess
AssemblyBuilderAccess.Run; Naznačuje, že zostava môže byť vykonaná, ale nie uložená. AssemblyBuilderAccess.Save; Naznačuje, že zostavenie sa dá zachrániť, ale nie vykonať. AssemblyBuilderAccess.RunAndSave; Naznačuje, že assembler je možné uložiť a spustiť. AssemblyBuilderAccess.ReflectionOnly; Naznačuje, že zostavy môžu byť použité iba v reflexnom kontexte a nemôžu byť vykonávané. AssemblyBuilderAccess.RunAndCollect; Označuje, že zostava môže byť odbremenená a pamäť získaná späť.
Kód je nasledovný:
Najprv použite emit na generovanie IL kódu, potom dynamicky vygenerujte zostavu a nakoniec načítajte zostavu a zavolajte jej metódy, ako je znázornené na obrázku nižšie:
Použite ILSpy na zobrazenie vygenerovaného kódu, ako je zobrazené na obrázku nižšie:
(Koniec)
|
Predchádzajúci:Rozdiel medzi kompilátorom Roslyn MSBuildBudúci:.NET/C# Testovanie výkonu reflexie, emitovania, výrazu
|