Denna artikel är en spegelartikel om maskinöversättning, klicka här för att hoppa till originalartikeln.

Utsikt: 50355|Svar: 0

[Källa] .NET/C# Emittera dynamiskt genererar assemblies

[Kopiera länk]
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-kompilatorn
Nästa:.NET/C# Reflektion, Emitt, Uttrycksprestandatestning
Friskrivning:
All programvara, programmeringsmaterial eller artiklar som publiceras av Code Farmer Network är endast för lärande- och forskningsändamål; Ovanstående innehåll får inte användas för kommersiella eller olagliga ändamål, annars kommer användarna att bära alla konsekvenser. Informationen på denna sida kommer från internet, och upphovsrättstvister har inget med denna sida att göra. Du måste helt radera ovanstående innehåll från din dator inom 24 timmar efter nedladdning. Om du gillar programmet, vänligen stöd äkta programvara, köp registrering och få bättre äkta tjänster. Om det finns något intrång, vänligen kontakta oss via e-post.

Mail To:help@itsvse.com