2012-03-18 17 views
8

Me he topado con métodos dinámicos un poco en el código C# basado en la reflexión, y todavía tengo que descubrir qué son exactamente. Específicamente, parece haber una clase DynamicMethod que permite la generación y especificación de métodos CLR en tiempo de ejecución. Pero también está la clase MethodBuilder. Ambos parecen hacer cosas muy similares. Aparentemente, los "ensamblados dinámicos" son AssemblyBuilder clases y los "tipos dinámicos" son TypeBuilder clases. Todos residen en el espacio de nombre System.Reflection.Emit en cualquier caso.¿Qué son los métodos dinámicos y cómo es DynamicMethod diferente de MethodBuilder?

Parece que MSDN tiene muy poca información de alto nivel sobre este tema. Entonces, si alguien pudiera explicar qué son los métodos dinámicos, dónde entran exactamente en juego todas las clases XYZBuilder, y para qué se usan cada una de ellas, sería genial. También apreciaría cualquier otro tipo y funcionalidad de Reflection.Emit que deba conocer.

Respuesta

9

Creo the documentation for DynamicMethod explica esto muy bien:

Usted puede utilizar la clase DynamicMethod para generar y ejecutar un método en tiempo de ejecución, sin tener que generar un montaje dinámico y un tipo dinámico para contener el método. El código ejecutable creado por el compilador Just-In-Time (JIT) se recupera cuando se reclama el objeto DynamicMethod. Los métodos dinámicos son la forma más eficiente de generar y ejecutar pequeñas cantidades de código.

Si necesita crear dinámicamente uno o más métodos, use DynamicMethod. Si desea crear tipos completos, significa que necesita crear un ensamblaje dinámico (AssemblyBuilder), luego crear un módulo dentro de él (ModuleBuilder) y luego crear uno o más tipos (TypeBuilder). Para crear métodos dentro de esos tipos, usaría MethodBuilder.

Otra diferencia es GC: DynamicMethod s se pueden recoger siempre basura y se recogen uno por uno. Es decir, cualquier método puede recopilarse tan pronto como deje de usarlo. Los conjuntos dinámicos, por otro lado, solo se pueden recopilar cuando lo especifique (utilizando AssemblyBuilderAccess.RunAndCollect) y siempre se recopilan ensamblados. Por ejemplo, si tiene dos tipos en un ensamblaje y solo usa uno, el otro no puede recopilarse.

+0

Doh. Debo haberme perdido esto al leer las páginas de MSDN tan tarde. Gracias. – Noldorin

Cuestiones relacionadas