Denne artikkelen er en speilartikkel om maskinoversettelse, vennligst klikk her for å hoppe til originalartikkelen.

Utsikt: 50355|Svare: 0

[Kilde] .NET/C# Emitter dynamisk genererer samlinger

[Kopier lenke]
Publisert 21.03.2021 kl. 12:38:34 | | | |
Applikasjonsscenarier, ifølge vår C#-kode, genererer dynamisk en EXE, applikasjonsscenarioene kan være veldig mange, som programvareautorisasjon, du kan legge inn autorisasjonsinformasjon, generere en autorisert DLL, osv., så hvordan oppnå denne funksjonen må vi nevne en teknisk Emitt.

1. Oversikt over Emit

Emitter, kan kalles emitterende eller genererende. I Framework eksisterer klasser relatert til Emit i hovedsak under System.Reflection.Emit-navnerommet. Det kan sees at Emit eksisterer som et element av refleksjon. Når vi snakker om refleksjon, bør alle være kjent med det, det lar oss se elementene i samlingen, slik at vi får en stor mengde informasjon som hvilke typer sammensetningen inneholder, hvilke metoder typen inneholder, og så videre. Men refleksjoner kan bare 'sees', mens Emit dynamisk kan generere kode under kjøring. La oss se på hvordan man genererer kode med Emit.

2. Montering og administrert modul

En assembly er en logisk gruppering av én eller flere moduler, ressursfiler, og sekundært er en assembly den minste enheten for gjenbruk, sikkerhet og versjonering. DLL-ene og EXE-ene vi ser kan kalles en assembly, en assembly inneholder flere moduler, men vanligvis, når vi VS-kompilerer, kompilerer vi bare én modul; hvis vi vil kompilere flere moduler i en assembly, må vi bruke csc.exe implementasjon.

3. Generer kodeoperasjoner dynamisk

Først må vi forstå hvilken type hver dynamisk type representeres av i .NET.

Assembly: System.Reflection.Emit.AssemblyBuilder (definerer og representerer dynamiske assemblies)

Konstruktør: System.Reflection.Emit.ConstructorBuilder (en konstruktør som definerer og representerer dynamiske klasser)

Egendefinert attributt: System.Reflection.Emit.CustomAttributeBuilder (hjelper til med å generere egendefinerte attributter ved hjelp av parametere sendt av konstruktøren for å generere attributter for klasser)

Enum: System.Reflection.Emit.EnumBuilder (forklarer og angir enum-typen)

Hendelse: System.Reflection.Emit.EventBuilder (hendelse som definerer klassen)

Field: System.Reflection.Emit.FieldBuilder (Definerer og representerer felt.) kan ikke arve en slik klasse)

Lokale variabler: System.Reflection.Emit.LocalBuilder (representerer lokale variabler i en metode eller konstruktør)

Metode: System.Reflection.Emit.MethodBuilder (en metode (eller konstruktør) som definerer og representerer en dynamisk klasse)

Modul: System.Reflection.Emit.ModuleBuilder (definerer og representerer moduler i dynamiske sammensetninger)

Parameter: System.Reflection.Emit.ParameterBuilder (opprett eller assosier parameterinformasjon som metodeparametere, hendelsesparametere osv.)

Egenskap: System.Reflection.Emit.PropertyBuilder (Definer typen egenskap)

Klasse: System.Reflection.Emit.TypeBuilder (definer og opprett en ny instans av klassen under kjøring)

OpCode er en beskrivelse av et mellomliggende språk (IL)-direktiv. Det finnes mange instruksjoner for dette, du kan sjekke den offisielle Microsoft-nettsiden:Innloggingen med hyperkoblingen er synlig.

AssemblyBuilderAccess-tilgangsbegrensninger

AssemblyBuilderAccess.Run; Indikerer at samlingen kan kjøres, men ikke lagres.
AssemblyBuilderAccess.Save; Indikerer at samlingen kan lagres, men ikke kjøres.
AssemblyBuilderAccess.RunAndSave; Indikerer at assemblyen kan lagres og kjøres.
AssemblyBuilderAccess.ReflectionOnly; Indikerer at assemblies kun kan brukes i en reflekterende kontekst og ikke kan utføres.
AssemblyBuilderAccess.RunAndCollect; Indikerer at sammensetningen kan losses og minne tas tilbake.

Koden er som følger:

Først bruker du emit for å generere IL-kode, deretter genererer du dynamisk en assembly, og til slutt laster du assemblyen og kaller dens metoder, som vist i figuren nedenfor:



Bruk ILSpy for å se den genererte koden som vist på bildet under:



(Slutt)





Foregående:Forskjellen mellom Roslyn MSBuild-kompilatoren
Neste:.NET/C# Refleksjon, Emitt, Uttrykksytelsestesting
Ansvarsfraskrivelse:
All programvare, programmeringsmateriell eller artikler publisert av Code Farmer Network er kun for lærings- og forskningsformål; Innholdet ovenfor skal ikke brukes til kommersielle eller ulovlige formål, ellers skal brukerne bære alle konsekvenser. Informasjonen på dette nettstedet kommer fra Internett, og opphavsrettstvister har ingenting med dette nettstedet å gjøre. Du må fullstendig slette innholdet ovenfor fra datamaskinen din innen 24 timer etter nedlasting. Hvis du liker programmet, vennligst støtt ekte programvare, kjøp registrering, og få bedre ekte tjenester. Hvis det foreligger noen krenkelse, vennligst kontakt oss på e-post.

Mail To:help@itsvse.com