Ta članek je zrcalni članek strojnega prevajanja, kliknite tukaj za skok na izvirni članek.

Pogled: 50355|Odgovoriti: 0

[Vir] .NET/C# Emit dinamično generira sestave

[Kopiraj povezavo]
Objavljeno 21. 3. 2021 ob 12:38:34 | | | |
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)





Prejšnji:Razlika med prevajalnikom Roslyn MSBuild
Naslednji:.NET/C# testiranje zmogljivosti refleksije, oddajanja in izražanja
Disclaimer:
Vsa programska oprema, programski materiali ali članki, ki jih izdaja Code Farmer Network, so namenjeni zgolj učnim in raziskovalnim namenom; Zgornja vsebina ne sme biti uporabljena v komercialne ali nezakonite namene, sicer uporabniki nosijo vse posledice. Informacije na tej strani prihajajo z interneta, spori glede avtorskih pravic pa nimajo nobene zveze s to stranjo. Zgornjo vsebino morate popolnoma izbrisati z računalnika v 24 urah po prenosu. Če vam je program všeč, podprite pristno programsko opremo, kupite registracijo in pridobite boljše pristne storitve. Če pride do kakršne koli kršitve, nas prosimo kontaktirajte po elektronski pošti.

Mail To:help@itsvse.com