Tento článok je zrkadlovým článkom o strojovom preklade, kliknite sem pre prechod na pôvodný článok.

Pohľad: 50355|Odpoveď: 0

[Zdroj] .NET/C# Emit dynamicky generuje zostavy

[Kopírovať odkaz]
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 MSBuild
Budúci:.NET/C# Testovanie výkonu reflexie, emitovania, výrazu
Vyhlásenie:
Všetok softvér, programovacie materiály alebo články publikované spoločnosťou Code Farmer Network slúžia len na vzdelávacie a výskumné účely; Vyššie uvedený obsah nesmie byť použitý na komerčné alebo nezákonné účely, inak nesú všetky následky používateľmi. Informácie na tejto stránke pochádzajú z internetu a spory o autorské práva s touto stránkou nesúvisia. Musíte úplne vymazať vyššie uvedený obsah zo svojho počítača do 24 hodín od stiahnutia. Ak sa vám program páči, podporte originálny softvér, zakúpte si registráciu a získajte lepšie originálne služby. Ak dôjde k akémukoľvek porušeniu, kontaktujte nás prosím e-mailom.

Mail To:help@itsvse.com