Este artículo es un artículo espejo de traducción automática, por favor haga clic aquí para saltar al artículo original.

Vista: 50355|Respuesta: 0

[Fuente] .NET/C# Emit genera ensamblajes dinámicamente

[Copiar enlace]
Publicado el 2021-3-21 12:38:34 | | | |
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)





Anterior:La diferencia entre el compilador Roslyn MSBuild
Próximo:Pruebas de rendimiento de la reflexión, emisión y expresión .NET/C#
Renuncia:
Todo el software, materiales de programación o artículos publicados por Code Farmer Network son únicamente para fines de aprendizaje e investigación; El contenido anterior no se utilizará con fines comerciales o ilegales; de lo contrario, los usuarios asumirán todas las consecuencias. La información de este sitio proviene de Internet, y las disputas de derechos de autor no tienen nada que ver con este sitio. Debes eliminar completamente el contenido anterior de tu ordenador en un plazo de 24 horas desde la descarga. Si te gusta el programa, por favor apoya el software genuino, compra el registro y obtén mejores servicios genuinos. Si hay alguna infracción, por favor contáctanos por correo electrónico.

Mail To:help@itsvse.com