Gli scenari applicabili, tramite il nostro codice C#, generano dinamicamente un EXE, i suoi scenari applicativi possono essere molti, come l'autorizzazione software, puoi inserire le informazioni di autorizzazione, generare una DLL autorizzata, ecc., quindi come ottenere questa funzione dobbiamo menzionare un Emissione tecnica.
1. Panoramica di Emit
Emettere può essere chiamato emettere o generare. In Framework, le classi correlate a Emit esistono fondamentalmente sotto il namespace System.Reflection.Emit. Si può vedere che Emit esiste come elemento di riflessione. Parlando di riflessione, tutti dovrebbero conoscerla, ci permette di vedere gli elementi dell'assemblaggio, così da ottenere una grande quantità di informazioni come quali tipi contiene l'assemblaggio, quali metodi contiene il tipo, e così via. Ma le riflessioni possono essere solo 'viste', mentre Emit può generare codice dinamicamente a runtime. Diamo un'occhiata a come generare codice con Emit.
2. Modulo di Assemblaggio e Gestito
Un assembly è un raggruppamento logico di uno o più moduli, file risorse, e secondariamente un assembly è l'unità più piccola di riutilizzo, sicurezza e versioning. Le DLL e gli EXE che vediamo possono essere chiamati assembly, un assembly contiene più moduli, ma di solito, quando VS compiliamo compiliamo solo un modulo; se vogliamo compilare più moduli in un assembly, dobbiamo usare csc.exe implementazione.
3. Generare dinamicamente operazioni di codice
Prima di tutto, dobbiamo capire da quale tipo è rappresentato ciascun tipo dinamico in .NET.
Assembly: System.Reflection.Emit.AssemblyBuilder (definisce e rappresenta assemblaggi dinamici)
Costruttore: System.Reflection.Emit.ConstructorBuilder (un costruttore che definisce e rappresenta classi dinamiche)
Attributo personalizzato: System.Reflection.Emit.CustomAttributeBuilder (aiuta a generare attributi personalizzati utilizzando parametri passati dal costruttore per generare attributi per le classi)
Enum: System.Reflection.Emit.EnumBuilder (spiega e indica il tipo di enum)
Event: System.Reflection.Emit.EventBuilder (evento che definisce la classe)
Campo: System.Reflection.Emit.FieldBuilder (Definisce e rappresenta i campi.) non può ereditare tale classe)
Variabili locali: System.Reflection.Emit.LocalBuilder (rappresenta variabili locali all'interno di un metodo o costruttore)
Metodo: System.Reflection.Emit.MethodBuilder (un metodo (o costruttore) che definisce e rappresenta una classe dinamica)
Modulo: System.Reflection.Emit.ModuleBuilder (definisce e rappresenta i moduli negli assemblaggi dinamici)
Parametro: System.Reflection.Emit.ParameterBuilder (creare o associare informazioni sui parametri come parametri di metodo, parametri di evento, ecc.)
Proprietà: System.Reflection.Emit.PropertyBuilder (Definisci il tipo di proprietà)
Class: System.Reflection.Emit.TypeBuilder (definire e creare una nuova istanza della classe a runtime)
OpCode è una descrizione di una direttiva di linguaggio intermedio (IL). Ci sono molte istruzioni a riguardo, puoi controllare il sito ufficiale di Microsoft:Il login del link ipertestuale è visibile.
Restrizioni di accesso a AssemblyBuilderAccess
AssemblyBuilderAccess.Run; Indica che l'assemblaggio può essere eseguito, ma non salvato. AssemblyBuilderAccess.Save; Indica che l'assembly può essere salvato, ma non eseguito. AssemblyBuilderAccess.RunAndSave; Indica che l'assemblaggio può essere salvato ed eseguito. AssemblyBuilderAccess.ReflectionOnly; Indica che gli assembly possono essere usati solo in un contesto riflessivo e non possono essere eseguiti. AssemblyBuilderAccess.RunAndCollect; Indica che l'assembly può essere scaricato e la memoria viene recuperata.
Il codice è il seguente:
Innanzitutto, usare emit per generare codice IL, poi generare dinamicamente un assembly e infine caricare l'assembly e richiamare i suoi metodi, come mostrato nella figura sottostante:
Usa ILSpy per visualizzare il codice generato come mostrato nell'immagine sottostante:
(Fine)
|