2011-12-21 17 views
7

He programado .NET y C# desde hace años, pero me he encontrado recientemente con el tipo DynamicMethod junto con el concepto de ensamblaje dinámico en el contexto de la reflexión. Parece que siempre se utilizan dentro de la generación IL (código de tiempo de ejecución).Ensambles dinámicos y métodos

Desafortunadamente, MSDN hace un trabajo extraordinariamente pobre al definir lo que es realmente un ensamblaje/método dinámico y para qué deberían ser utilizados. ¿Podría alguien aclararme aquí por favor? ¿Hay algo que ver con el DLR? ¿En qué se diferencian de la generación estática (normal) de ensamblajes y métodos en tiempo de ejecución? ¿Qué debería saber sobre cómo y cuándo usarlos?

+0

No hay ningún tipo denominado "DynamicAssembly" en el marco. ¿Estás hablando de AssemblyBuilder? El tutorial Reflection.Emit de MSDN está aquí: http://msdn.microsoft.com/en-us/library/3y322t50.aspx –

+0

@Dan Rigby: Cheers. – Noldorin

+0

@HansPassant: Bueno, tal vez ningún tipo, pero definitivamente un concepto: http://msdn.microsoft.com/en-us/library/4xtysk39.aspx – Noldorin

Respuesta

4

DynamicMethod se utilizan para crear métodos sin ningún ensamblaje nuevo. También se pueden crear para una clase, para que pueda acceder a sus miembros privados. Finalmente, la clase DynamicMethod creará un delegado que puede usar para ejecutar el método. Por ejemplo, para acceder a un campo privado:

var d = new DynamicMethod("my_dynamic_get_" + field.Name, typeof(object), new[] { typeof(object) }, type, true); 
var il = d.GetILGenerator(); 
il.Emit(OpCodes.Ldarg_0); 
il.Emit(OpCodes.Ldfld, field); 
if (field.FieldType.IsValueType) 
    il.Emit(OpCodes.Box, field.FieldType); 
else 
    il.Emit(OpCodes.Castclass, typeof(object)); 

il.Emit(OpCodes.Ret); 
var @delegate = (Func<object, object>)d.CreateDelegate(typeof(Func<object, object>)); 

Espero que ayude.

+0

Y no tiene nada que ver con DLR. Es un método creado sobre la marcha. – ivowiblo

+0

Ah, ya veo. Eso lo aclara un poco, así que gracias por eso. ¿Hay algún equivalente en un * tipo * dinámico o tal? ¿O qué hay del ensamblaje? Pensé que siempre podría crear ensamblajes sobre la marcha en el pasado, y no recuerdo la palabra "dinámica" que entra realmente. – Noldorin

+0

Para tipos y ensambles, es solo un nombre. DynamicMethod es una clase real. – ivowiblo

Cuestiones relacionadas