|
|
Publicerad 2021-3-21 12:38:34
|
|
|
|

Applikationsscenarier, enligt vår C#-kod, genererar dynamiskt en EXE, dess applikationsscenarier kan vara mycket många, såsom mjukvaruauktorisation, du kan mata in auktorisationsinformation, generera en auktoriserad DLL, etc., så hur man uppnår denna funktion måste vi nämna en teknisk Emit.
1. Översikt av Emit
Emitterar kan kallas emitterande eller genererande. I Framework existerar klasser relaterade till Emit i princip under namnrymden System.Reflection.Emit. Det kan ses att Emit existerar som ett element av reflektion. På tal om reflektion, alla borde vara bekanta med det, det låter oss se elementen i samlingen för att få en stor mängd information såsom vilka typer sammansättningen innehåller, vilka metoder typen innehåller, och så vidare. Men reflektioner kan bara 'ses', medan Emit dynamiskt kan generera kod vid körning. Låt oss titta på hur man genererar kod med Emit.
2. Monterings- och hanterad modul
En assembly är en logisk gruppering av en eller flera moduler, resursfiler, och sekundärt är en assembly den minsta enheten för återanvändning, säkerhet och versionshantering. De DLL:er och EXE:er vi ser kan kallas en assembly, en assembly innehåller flera moduler, men vanligtvis, när vi VS-kompilerar, kompilerar vi bara en modul, om vi vill kompilera flera moduler i en assembly behöver vi använda csc.exe implementation.
3. Generera kodoperationer dynamiskt
Först måste vi förstå vilken typ varje dynamisk typ representeras av i .NET.
Assembly: System.Reflection.Emit.AssemblyBuilder (definierar och representerar dynamiska assemblies)
Konstruktör: System.Reflection.Emit.ConstructorBuilder (en konstruktör som definierar och representerar dynamiska klasser)
Anpassad attribut: System.Reflection.Emit.CustomAttributeBuilder (hjälper till att generera anpassade attribut med parametrar som skickas av konstruktören för att generera attribut för klasser)
Enum: System.Reflection.Emit.EnumBuilder (förklarar och anger enumtypen)
Händelse: System.Reflection.Emit.EventBuilder (händelse som definierar klassen)
Fält: System.Reflection.Emit.FieldBuilder (Definierar och representerar fält.) kan inte ärva en sådan klass)
Lokala variabler: System.Reflection.Emit.LocalBuilder (representerar lokala variabler inom en metod eller konstruktör)
Metod: System.Reflection.Emit.MethodBuilder (en metod (eller konstruktör) som definierar och representerar en dynamisk klass)
Modul: System.Reflection.Emit.ModuleBuilder (definierar och representerar moduler i dynamiska assemblies)
Parameter: System.Reflection.Emit.ParameterBuilder (skapa eller associera parameterinformation såsom metodparametrar, händelseparametrar, etc.)
Egenskap: System.Reflection.Emit.PropertyBuilder (Definiera typen av egenskap)
Klass: System.Reflection.Emit.TypeBuilder (definiera och skapa en ny instans av klassen vid körning)
OpCode är en beskrivning av ett mellanliggande språk (IL)-direktiv. Det finns många instruktioner för detta, du kan kolla på Microsofts officiella webbplats:Inloggningen med hyperlänken är synlig.
AssemblyBuilderAccess-åtkomstbegränsningar
AssemblyBuilderAccess.Run; Indikerar att assembleren kan köras men inte sparas. AssemblyBuilderAccess.Save; Indikerar att assembleren kan sparas men inte köras. AssemblyBuilderAccess.RunAndSave; Indikerar att assembleren kan sparas och köras. AssemblyBuilderAccess.ReflectionOnly; Indikerar att sammansättningar endast kan användas i ett reflekterande sammanhang och inte kan exekveras. AssemblyBuilderAccess.RunAndCollect; Indikerar att sammansättningen kan lastas ur och minnet återvinns.
Koden är följande:
Först använder du emit för att generera IL-kod, genererar sedan dynamiskt en assembler och laddar slutligen assembleren och anropar dess metoder, som visas i figuren nedan:
Använd ILSpy för att se den genererade koden som visas på bilden nedan:
(Slut)
|
Föregående:Skillnaden mellan Roslyn MSBuild-kompilatornNästa:.NET/C# Reflektion, Emitt, Uttrycksprestandatestning
|