Escenarios del método dinámico de la emisión de la reflexión

Los métodos dinámicos creados utilizando la clase DynamicMethod (nueva en la versión 2.0 de .NET Framework) proporcionan capacidades ampliadas para emitir métodos estáticos en tiempo de ejecución. Los métodos dinámicos expanden la funcionalidad de los tipos del espacio de nombres System.Reflection.Emit de varias maneras:

  • Tienen menos carga de procesamiento, porque no hay ninguna necesidad de generar ensamblados dinámicos, módulos y tipos para contener los métodos.

  • En las aplicaciones que se ejecutan durante mucho tiempo, proporcionan una mejor utilización de recursos porque la memoria utilizada por los cuerpos de los métodos se pueden reclamar cuando el método deja de ser necesario.

  • Con permisos de seguridad suficientes, proporcionan la capacidad de asociar código a un ensamblado o tipo existente, y ese código puede tener la misma visibilidad que los tipos internos o los miembros privados.

  • Con permisos de seguridad suficientes, permiten al código omitir las comprobaciones de visibilidad Just-in-time (JIT) y tener acceso a los datos privados y protegidos de los objetos.

Los métodos dinámicos pueden utilizar un objeto ILGenerator para emitir el Lenguaje intermedio de Microsoft (MSIL). Además, los métodos dinámicos pueden utilizar un objeto DynamicILInfo para trabajar con símbolos (tokens) de metadatos que permiten a los clientes sofisticados realizar su propia generación MSIL.

Los métodos dinámicos son útiles en escenarios donde para conseguir un buen rendimiento se requiere la generación de código en tiempo de ejecución. Los ejemplos expuestos en esta sección incluyen la serialización, asignaciones entre los objetos y bases de datos relacionales, expresiones regulares, evaluación parcial y compiladores para lenguajes que requieren motores en tiempo de ejecución.

Para obtener un ejemplo simple de generación dinámica de métodos, vea Cómo: Definir y ejecutar métodos dinámicos.

Lenguajes que admiten las llamadas enlazadas en tiempo de ejecución

Los métodos dinámicos son útiles para los autores de compiladores cuando no se conoce el tipo de un objeto en tiempo de compilación. Las llamadas a los miembros del objeto se deben resolver en tiempo de ejecución, con frecuencia con el trabajo adicional de manipular las listas de argumentos. El siguiente código de Visual Basic proporciona un ejemplo de esto.

Sub Example(ByVal obj as Object)
    ' ...
    obj.SomeMethod(x, y, z)
    ' ...
End Sub

El compilador debe generar el código para buscar SomeMethod, preparar los argumentos como una matriz de objetos e invocar el método. Ejecutar esas llamadas con reflexión, mediante el método InvokeMember, no genera un buen rendimiento. El rendimiento se puede mejorar utilizando miembros del espacio de nombres System.Reflection.Emit para crear un ensamblado, módulo, tipo y método dinámico, pero esto puede tener como resultado un mayor espacio de trabajo y mayor complejidad del código. Los métodos dinámicos permiten realizar una estrategia de implementación más eficiente en los casos en que la firma de método dinámico coincide con un tipo delegado existente, porque no hay necesidad de crear un ensamblado, módulo o tipo dinámico. Este enfoque genera mayor rendimiento que el método InvokeMember. Su rendimiento no es tan bueno como el de una llamada virtual, pero requiere un espacio de trabajo mucho menor porque no se crea ningún nuevo tipo. Además, el código MSIL generado y el código nativo asociado se puede reclamar cuando ya no se necesita.

Serialización

Los métodos dinámicos pueden eliminar la necesidad de escribir serialización personalizada y código de deserialización. Puede marcar un tipo serializable de acuerdo con reglas sencillas y luego usar un motor de serialización para examinar los metadatos del tipo, generar un serializador y un deserializador adecuados, según sea necesario, y ejecutar el código en instancias del tipo.

Con los permisos de seguridad suficientes, un motor de serialización implementado utilizando métodos dinámicos puede tener acceso a datos privados y protegidos para habilitar la serialización de objetos no creados por el autor del motor.

Los métodos generados se pueden almacenar en memoria caché o, simplemente, liberarse.

Evaluación parcial

La evaluación parcial, también conocida como especialización del programa, es una técnica usada para optimizar algoritmos en los que una o varias de las variables de entrada pueden variar más lentamente que otras entradas. La evaluación parcial genera llamadas a métodos especializados que tratan los valores de las entradas de variación lenta como si fueran constantes, permitiendo aplicar optimizaciones adicionales al algoritmo como un todo.

Con esta técnica, con frecuencia es posible transformar un algoritmo de uso general con bajo rendimiento en un algoritmo especializado de alto rendimiento. A continuación se ofrecen algunos ejemplos:

  • Compilar un objeto Regex para generar un programa especializado para coincidir respecto a un modelo determinado.

  • Compilar un motor de serialización controlado por metadatos en un programa especial para serializar y deserializar un tipo concreto o un conjunto de tipos.

  • Compilar un esquema XML para generar un programa especializado para validar un esquema determinado.

  • Compilar una transformación XSLT en un programa especializado para transformar un documento XML de una manera específica.

  • Compilar un programa de cifrado genérico que cifra datos utilizando una clave especificada en un programa que está optimizado para una clave determinada.

Los métodos dinámicos se pueden utilizar para implementar la evaluación parcial generando los métodos especializados en tiempo de ejecución. Además de las mejoras de rendimiento, los métodos dinámicos permiten la reclamación de los cuerpos métodos de MSIL y el código máquina relacionado generados por el compilador JIT. Esto puede ser fundamental en programas que se ejecutan durante períodos prolongados.

Para obtener una descripción más detallada de algunos de estos escenarios, vea Escenarios de aplicación de la emisión de la reflexión.

Generar código de usuario personalizado en tiempo de ejecución

Muchas aplicaciones o plataformas tienen mecanismos de extensibilidad que proporcionan a los usuarios la capacidad de escribir y ejecutar código personalizado mientras se está ejecutando la aplicación, normalmente mediante el uso de funciones predefinidas. Utilizando métodos dinámicos para generar este código, el diseñador de aplicaciones o plataformas puede reducir la cantidad de funciones requeridas (y por tanto el consumo de memoria) y proporcionar al usuario más flexibilidad sin perjuicio del rendimiento.

Vea también

Tareas

Cómo: Definir y ejecutar métodos dinámicos

Referencia

DynamicMethod

Conceptos

Escenarios de aplicación de la emisión de la reflexión

Otros recursos

Emitir métodos y ensamblados dinámicos