Los escenarios de aplicación, según nuestro código C#, generan dinámicamente un EXE, sus escenarios de aplicación pueden ser muchos, como la autorización de software, puedes introducir la información de autorización, generar una DLL autorizada, etc., así que para lograr esta función, debemos mencionar una emisión técnica.
1. Visión general de Emit
Emitir, puede llamarse emitir o generar. En Framework, las clases relacionadas con Emit existen básicamente bajo el espacio de nombres System.Reflection.Emit. Se puede ver que Emit existe como un elemento de reflexión. Hablando de reflexión, todo el mundo debería estar familiarizado con ella, nos permite observar los elementos del ensamblaje, para obtener una gran cantidad de información, como qué tipos contiene el ensamblaje, qué métodos contiene, y así sucesivamente. Pero las reflexiones solo pueden ser 'vistas', mientras que Emit puede generar código dinámicamente en tiempo de ejecución. Veamos cómo generar código con Emit.
2. Ensamblaje y módulo gestionado
Un ensamblador es un agrupamiento lógico de uno o más módulos, archivos de recursos y, en segundo lugar, un ensamblador es la unidad más pequeña de reutilización, seguridad y versionado. Las DLLs y EXE que vemos pueden llamarse ensamblador, un ensamblador contiene múltiples módulos, pero normalmente, cuando compilamos VS, solo compilamos un módulo; si queremos compilar varios módulos en ensamblador, necesitamos usar csc.exe implementación.
3. Generar dinámicamente operaciones de código
Primero, necesitamos entender qué tipo representa cada tipo dinámico en .NET.
Assembly: System.Reflection.Emit.AssemblyBuilder (define y representa los ensamblajes dinámicos)
Constructor: System.Reflection.Emit.ConstructorBuilder (un constructor que define y representa clases dinámicas)
Atributo personalizado: System.Reflection.Emit.CustomAttributeBuilder (ayuda a generar atributos personalizados usando parámetros pasados por el constructor para generar atributos para las clases)
Enum: System.Reflection.Emit.EnumBuilder (explica e indica el tipo de enum)
Evento: System.Reflection.Emit.EventBuilder (evento que define la clase)
Campo: System.Reflection.Emit.FieldBuilder (Define y representa campos.) no puede heredar tal clase)
Variables locales: System.Reflection.Emit.LocalBuilder (representa variables locales dentro de un método o constructor)
Método: System.Reflection.Emit.MethodBuilder (un método (o constructor) que define y representa una clase dinámica)
Módulo: System.Reflection.Emit.ModuleBuilder (define y representa módulos en ensamblajes dinámicos)
Parámetro: System.Reflection.Emit.ParameterBuilder (crear o asociar información de parámetros como parámetros de método, parámetros de evento, etc.)
Propiedad: System.Reflection.Emit.PropertyBuilder (Define el tipo de propiedad)
Clase: System.Reflection.Emit.TypeBuilder (definir y crear una nueva instancia de la clase en tiempo de ejecución)
OpCode es una descripción de una directiva de lenguaje intermedio (IL). Hay muchas instrucciones para esto, puedes consultar la web oficial de Microsoft:El inicio de sesión del hipervínculo es visible.
Restricciones de acceso a AssemblyBuilderAccess
AssemblyBuilderAccess.Run; Indica que el ensamblaje puede ejecutarse, pero no guardarse. AssemblyBuilderAccess.Save; Indica que el ensamblaje puede guardarse, pero no ejecutarse. AssemblyBuilderAccess.RunySave; Indica que el ensamblaje puede guardarse y ejecutarse. AssemblyBuilderAccess.ReflectionOnly; Indica que los ensamblajes solo pueden usarse en un contexto reflexivo y no pueden ejecutarse. AssemblyBuilderAccess.RunyCollect; Indica que el ensamblador puede descargarse y recuperar memoria.
El código es el siguiente:
Primero, usa emit para generar código IL, luego genera dinámicamente un ensamblador y, finalmente, carga el ensamblador y llama a sus métodos, como se muestra en la figura siguiente:
Utiliza ILSpy para ver el código generado como se muestra en la imagen de abajo:
(Fin)
|