Tämä artikkeli on konekäännöksen peiliartikkeli, klikkaa tästä siirtyäksesi alkuperäiseen artikkeliin.

Näkymä: 50355|Vastaus: 0

[Lähde] .NET/C# Emit generoi kokoonpanoja dynaamisesti

[Kopioi linkki]
Julkaistu 2021-3-21 klo 12:38:34 | | | |
Sovellusskenaariot, C#-koodimme avulla, generoivat dynaamisesti EXE:n, sen sovellusskenaariot voivat olla hyvin monia, kuten ohjelmiston valtuutus, voit syöttää valtuutustiedot, luoda valtuutetun DLL:n jne., joten tämän toiminnon saavuttamiseksi on mainittava tekninen Emit.

1. Yleiskatsaus päästöihin

Emitointia voidaan kutsua emitaatioksi tai generoimiseksi. Frameworkissa Emitiin liittyvät luokat ovat käytännössä olemassa System.Reflection.Emit -nimiavaruudessa. On nähtävissä, että Emit on olemassa heijastuksen elementtinä. Reflektiosta puheen ollen, kaikkien tulisi tuntea se, sillä se antaa meille mahdollisuuden tarkastella kokoonpanon elementtejä, jotta voimme saada suuren määrän tietoa, kuten mitä tyyppejä kokoonpano sisältää, mitä menetelmiä tyyppi sisältää ja niin edelleen. Mutta heijastuksia voi vain 'nähdä', kun taas Emit voi dynaamisesti tuottaa koodia ajonaikaisesti. Katsotaanpa, miten koodia generoidaan Emitillä.

2. Kokoonpano- ja hallittu moduuli

Assembly on looginen ryhmittely yhdestä tai useammasta moduulista, resurssitiedostoista, ja toissijaisesti assembly on pienin uudelleenkäytön, turvallisuuden ja version yksikkö. Näkemämme DLL:t ja EXE:t voidaan kutsua assemblyksi, kokoonpano sisältää useita moduuleja, mutta yleensä, kun käännämme VS:n, käännämme vain yhden moduulin, jos haluamme kääntää useita moduuleja assemblyssä, meidän täytyy käyttää csc.exe toteutusta.

3. Generoi dynaamisesti koodioperaatioita

Ensiksi meidän täytyy ymmärtää, millä tyypillä kukin dynaaminen tyyppi esitetään .NET:ssä.

Assembly: System.Reflection.Emit.AssemblyBuilder (määrittelee ja edustaa dynaamisia kokoonpanoja)

Constructor: System.Reflection.Emit.ConstructorBuilder (rakentaja, joka määrittelee ja edustaa dynaamisia luokkia)

Mukautettu attribuutti: System.Reflection.Emit.CustomAttributeBuilder (auttaa luomaan räätälöityjä attribuutteja käyttämällä parametreja, jotka rakentaja antaa luokkien attribuutteja)

Enum: System.Reflection.Emit.EnumBuilder (selittää ja ilmaisee enum-tyypin)

Event: System.Reflection.Emit.EventBuilder (tapahtuma, joka määrittelee luokan)

Kenttä: System.Reflection.Emit.FieldBuilder (Määrittelee ja edustaa kenttiä.) ei voi periä tällaista luokkaa)

Paikalliset muuttujat: System.Reflection.Emit.LocalBuilder (edustaa paikallisia muuttujia metodissa tai konstruktorissa)

Metodi: System.Reflection.Emit.MethodBuilder (metodi (tai konstruktori), joka määrittelee ja edustaa dynaamista luokkaa)

Moduuli: System.Reflection.Emit.ModuleBuilder (määrittelee ja esittää moduuleja dynaamisissa kokoonpanoissa)

Parameter: System.Reflection.Emit.ParameterBuilder (luo tai liittää parametritietoja, kuten metodiparatuureja, tapahtumaparametreja jne.)

Ominaisuus: System.Reflection.Emit.PropertyBuilder (Määrittele ominaisuuden tyyppi)

Luokka: System.Reflection.Emit.TypeBuilder (määrittele ja luo uusi instanssi luokasta ajonaikaisesti)

OpCode on välikielen (IL) direktiivin kuvaus. Ohjeita on paljon, voit tarkistaa Microsoftin virallisen verkkosivun:Hyperlinkin kirjautuminen on näkyvissä.

AssemblyBuilderAccess-käyttörajoitukset

AssemblyBuilderAccess.Run; Tarkoittaa, että kokoonpano voidaan suorittaa, mutta sitä ei tallenneta.
AssemblyBuilderAccess.Save; Tarkoittaa, että kokoonpano voidaan tallentaa, mutta ei suorittaa.
AssemblyBuilderAccess.RunAndSave; Tarkoittaa, että kokoonpano voidaan tallentaa ja suorittaa.
AssemblyBuilderAccess.ReflectionOnly; Tarkoittaa, että kokoonpanoja voidaan käyttää vain heijastavassa kontekstissa eikä niitä voi suorittaa.
AssemblyBuilderAccess.RunAndCollect; Tarkoittaa, että kokoonpano voidaan purkaa ja muisti palautetaan.

Koodi on seuraava:

Ensin käytetään emit-koodia IL-koodin generointiin, sitten dynaamisesti generoidaan assembly, ja lopuksi ladataan assembly ja kutsutaan sen metodit, kuten alla olevassa kuvassa on esitetty:



Käytä ILSpyä nähdäksesi generoidun koodin, kuten alla olevassa kuvassa näkyy:



(Loppu)





Edellinen:Ero Roslyn MSBuild -kääntäjän välillä
Seuraava:.NET/C# Heijastus-, Emit- ja Expression-suorituskyvyn testaus
Vastuuvapauslauseke:
Kaikki Code Farmer Networkin julkaisemat ohjelmistot, ohjelmamateriaalit tai artikkelit ovat tarkoitettu vain oppimis- ja tutkimustarkoituksiin; Yllä mainittua sisältöä ei saa käyttää kaupallisiin tai laittomiin tarkoituksiin, muuten käyttäjät joutuvat kantamaan kaikki seuraukset. Tämän sivuston tiedot ovat peräisin internetistä, eikä tekijänoikeuskiistat liity tähän sivustoon. Sinun tulee poistaa yllä oleva sisältö kokonaan tietokoneeltasi 24 tunnin kuluessa lataamisesta. Jos pidät ohjelmasta, tue aitoa ohjelmistoa, osta rekisteröityminen ja hanki parempia aitoja palveluita. Jos rikkomuksia ilmenee, ota meihin yhteyttä sähköpostitse.

Mail To:help@itsvse.com