Denne artikel er en spejling af maskinoversættelse, klik venligst her for at springe til den oprindelige artikel.

Udsigt: 50355|Svar: 0

[Kilde] .NET/C# Emitterer dynamisk samlinger

[Kopier link]
Opslået den 21-3-2021 kl. 12:38:34 | | | |
Applikationsscenarier, ifølge vores C#-kode, genererer dynamisk en EXE, dens anvendelsesscenarier kan være meget mange, såsom softwareautorisation, du kan indtaste autorisationsoplysninger, generere en autoriseret DLL osv., så hvordan man opnår denne funktion, må vi nævne en teknisk Emit.

1. Oversigt over Emit

Emitter, kan kaldes emitterende eller genererende. I Framework eksisterer klasser relateret til Emit grundlæggende under System.Reflection.Emit navneområdet. Det kan ses, at Emit eksisterer som et element af refleksion. Når vi taler om refleksion, bør alle være bekendt med det, det giver os mulighed for at se elementerne i samlingen, så vi kan opnå en stor mængde information såsom hvilke typer samlingen indeholder, hvilke metoder typen indeholder osv. Men refleksioner kan kun 'ses', mens Emit dynamisk kan generere kode under kørsel. Lad os se på, hvordan man genererer kode med Emit.

2. Samling og administreret modul

En assembly er en logisk gruppering af en eller flere moduler, ressourcefiler, og sekundært er en assembly den mindste enhed for genbrug, sikkerhed og versionsstyring. De DLL'er og EXE'er, vi ser, kan kaldes en assembly; en assembly indeholder flere moduler, men normalt, når vi VS-kompilerer, kompilerer vi kun én modul; hvis vi vil kompilere flere moduler i en assembly, skal vi bruge csc.exe implementering.

3. Generer kodeoperationer dynamisk

Først skal vi forstå, hvilken type hver dynamisk type repræsenteres af i .NET.

Assembly: System.Reflection.Emit.AssemblyBuilder (definerer og repræsenterer dynamiske assemblies)

Konstruktør: System.Reflection.Emit.ConstructorBuilder (en konstruktør, der definerer og repræsenterer dynamiske klasser)

Brugerdefineret attribut: System.Reflection.Emit.CustomAttributeBuilder (hjælper med at generere brugerdefinerede attributter ved hjælp af parametre sendt af konstruktøren til at generere attributter for klasser)

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

Begivenhed: System.Reflection.Emit.EventBuilder (begivenhed, der definerer klassen)

Felt: System.Reflection.Emit.FieldBuilder (Definerer og repræsenterer felter.) kan ikke arve sådan en klasse)

Lokale variable: System.Reflection.Emit.LocalBuilder (repræsenterer lokale variable inden for en metode eller konstruktør)

Metode: System.Reflection.Emit.MethodBuilder (en metode (eller konstruktør), der definerer og repræsenterer en dynamisk klasse)

Modul: System.Reflection.Emit.ModuleBuilder (definerer og repræsenterer moduler i dynamiske samlinger)

Parameter: System.Reflection.Emitt.ParameterBuilder (opret eller tilknyt parameterinformation såsom metodeparametre, hændelsesparametre osv.)

Property: System.Reflection.Emit.PropertyBuilder (Definér typen af egenskab)

Klasse: System.Reflection.Emit.TypeBuilder (definer og opret en ny instans af klassen ved kørsel)

OpCode er en beskrivelse af et mellemliggende sprogdirektiv (IL). Der er mange instruktioner til dette, du kan tjekke Microsofts officielle hjemmeside:Hyperlink-login er synlig.

AssemblyBuilderAccess-adgangsbegrænsninger

AssemblyBuilderAccess.Run; Angiver at samlingen kan udføres, men ikke gemmes.
AssemblyBuilderAccess.Save; Indikerer, at samlingen kan gemmes, men ikke udføres.
AssemblyBuilderAccess.RunAndSave; Angiver at samlingen kan gemmes og udføres.
AssemblyBuilderAccess.ReflectionOnly; Indikerer, at samlinger kun kan bruges i en reflekterende kontekst og ikke kan eksekveres.
AssemblyBuilderAccess.RunAndCollect; Angiver at samlingen kan aflæsses, og hukommelsen kan genvindes.

Koden er som følger:

Først brug emit til at generere IL-kode, derefter generer du dynamisk en assembly, og til sidst indlæs assemblyen og kald dens metoder, som vist i figuren nedenfor:



Brug ILSpy til at se den genererede kode, som vist på billedet nedenfor:



(Slut)





Tidligere:Forskellen mellem Roslyn MSBuild-compileren
Næste:.NET/C# Refleksion, Emitter, Udtrykspræstationstest
Ansvarsfraskrivelse:
Al software, programmeringsmaterialer eller artikler udgivet af Code Farmer Network er kun til lærings- og forskningsformål; Ovenstående indhold må ikke bruges til kommercielle eller ulovlige formål, ellers skal brugerne bære alle konsekvenser. Oplysningerne på dette site kommer fra internettet, og ophavsretstvister har intet med dette site at gøre. Du skal slette ovenstående indhold fuldstændigt fra din computer inden for 24 timer efter download. Hvis du kan lide programmet, så understøt venligst ægte software, køb registrering og få bedre ægte tjenester. Hvis der er nogen overtrædelse, bedes du kontakte os via e-mail.

Mail To:help@itsvse.com