Dit artikel is een spiegelartikel van machinevertaling, klik hier om naar het oorspronkelijke artikel te gaan.

Bekijken: 50355|Antwoord: 0

[Bron] .NET/C# Emitteert dynamisch assemblies

[Link kopiëren]
Geplaatst op 21-3-2021 12:38:34 | | | |
Applicatiescenario's genereren volgens onze C#-code dynamisch een EXE, de toepassingsscenario's kunnen er heel veel zijn, zoals softwareautorisatie, je kunt autorisatiegegevens invoeren, een geautoriseerde DLL genereren, enzovoort, dus hoe deze functie te bereiken, moeten we een technische Emine noemen.

1. Overzicht van Emit

Emitteren, kan emitting of genererend worden genoemd. In Framework bestaan klassen gerelateerd aan Emit in feite onder de naamruimte System.Reflection.Emit. Het is te zien dat Emit bestaat als een element van reflectie. Over reflectie gesproken, iedereen zou ermee bekend moeten zijn, het stelt ons in staat de elementen van de assembly te bekijken, zodat we veel informatie kunnen verkrijgen, zoals welke types de assembly bevat, welke methoden het type bevat, enzovoort. Maar reflecties kunnen alleen 'gezien' worden, terwijl Emit dynamisch code kan genereren tijdens runtime. Laten we eens kijken hoe je code genereert met Emit.

2. Assemblage en beheerde module

Een assembly is een logische groepering van één of meer modules, resourcebestanden, en secundair is een assembly de kleinste eenheid voor hergebruik, beveiliging en versiebeheer. De DLL's en EXE's die we zien kunnen een assembly worden genoemd; een assembly bevat meerdere modules, maar meestal compileren we bij VS-compilatie maar één module; als we meerdere modules in een assembly willen compileren, moeten we csc.exe implementatie gebruiken.

3. Codebewerkingen dynamisch genereren

Eerst moeten we begrijpen welk type elk dynamisch type in .NET wordt weergegeven.

Assembly: System.Reflection.Emit.AssemblyBuilder (definieert en vertegenwoordigt dynamische assemblies)

Constructor: System.Reflection.Emit.ConstructorBuilder (een constructor die dynamische klassen definieert en vertegenwoordigt)

Aangepast attribuut: System.Reflection.Emit.CustomAttributeBuilder (helpt bij het genereren van aangepaste attributen met behulp van parameters die door de constructor worden doorgegeven om attributen voor klassen te genereren)

Enum: System.Reflection.Emit.EnumBuilder (legt uit en geeft het type enum aan)

Gebeurtenis: System.Reflection.Emit.EventBuilder (gebeurtenis die de klasse definieert)

Veld: System.Reflection.Emit.FieldBuilder (Definieert en vertegenwoordigt velden.) kan zo'n klasse niet erven)

Lokale variabelen: System.Reflection.Emit.LocalBuilder (vertegenwoordigt lokale variabelen binnen een methode of constructor)

Methode: System.Reflection.Emit.MethodBuilder (een methode (of constructor) die een dynamische klasse definieert en vertegenwoordigt)

Module: System.Reflection.Emit.ModuleBuilder (definieert en vertegenwoordigt modules in dynamische assemblies)

Parameter: System.Reflection.Emit.ParameterBuilder (maak of koppel parameterinformatie zoals methodeparameters, gebeurtenisparameters, enz.)

Property: System.Reflection.Emit.PropertyBuilder (Definieer het type eigenschap)

Klasse: System.Reflection.Emit.TypeBuilder (definieer en maak een nieuwe instantie van de klasse tijdens runtime)

OpCode is een beschrijving van een intermediate language (IL) richtlijn. Er zijn veel instructies hiervoor, je kunt de officiële Microsoft-website raadplegen:De hyperlink-login is zichtbaar.

AssemblyBuilderAccess toegangsbeperkingen

AssemblyBuilderAccess.Run; Geeft aan dat de assembly kan worden uitgevoerd, maar niet opgeslagen.
AssemblyBuilderAccess.Save; Geeft aan dat de assembly kan worden opgeslagen, maar niet uitgevoerd.
AssemblyBuilderAccess.RunAndSave; Geeft aan dat de assembly kan worden opgeslagen en uitgevoerd.
AssemblyBuilderAccess.ReflectionOnly; Geeft aan dat assemblies alleen in een reflectieve context kunnen worden gebruikt en niet uitgevoerd kunnen worden.
AssemblyBuilderAccess.RunAndCollect; Geeft aan dat de assembly kan worden ontladen en geheugen wordt teruggewonnen.

De code is als volgt:

Gebruik eerst emit om IL-code te genereren, vervolgens dynamisch een assembly te genereren, en laad tenslotte de assembly en roep de methoden aan, zoals weergegeven in de onderstaande figuur:



Gebruik ILSpy om de gegenereerde code te bekijken zoals te zien in de onderstaande afbeelding:



(Einde)





Vorig:Het verschil tussen de Roslyn MSBuild-compiler
Volgend:.NET/C# Reflectie-, Emit- en Expressieprestatietests
Disclaimer:
Alle software, programmeermaterialen of artikelen die door Code Farmer Network worden gepubliceerd, zijn uitsluitend bedoeld voor leer- en onderzoeksdoeleinden; De bovenstaande inhoud mag niet worden gebruikt voor commerciële of illegale doeleinden, anders dragen gebruikers alle gevolgen. De informatie op deze site komt van het internet, en auteursrechtconflicten hebben niets met deze site te maken. Je moet bovenstaande inhoud volledig van je computer verwijderen binnen 24 uur na het downloaden. Als je het programma leuk vindt, steun dan de echte software, koop registratie en krijg betere echte diensten. Als er sprake is van een inbreuk, neem dan contact met ons op via e-mail.

Mail To:help@itsvse.com