|
|
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-kompilatorenNeste:.NET/C# Refleksjon, Emitt, Uttrykksytelsestesting
|