2010-10-12 9 views
5

en el código cil, ldftn se usa para obtener la dirección del puntero a la función para llamar al constructor delegado (es decir, .ctor (objeto, int nativo)).
¿Cómo obtener el puntero de función utilizado para construir delegado en C#?obtener el puntero de función 'ldftn' en C#

+0

¿Desea la dirección del puntero sin procesar, o simplemente desea un objeto delegado en una variable? – siride

+0

el puntero de función utilizado para llamar al .ctor (es decir, .ctor (objeto, [int nativo])) – Kii

+1

No está muy claro de qué ctor está hablando. El valor _methodPtr solo puede ser generado por el compilador JIT. No hay nada para llamar hasta que genere el código de máquina para el método. –

Respuesta

5

Su pregunta está formulada de una manera que hace que sea difícil entender lo que realmente está tratando de hacer. Creo que quizás lo que quiere es algo como esto:

MethodInfo mi = ... 
var ptr = mi.MethodHandle.GetFunctionPointer(); 
// now call a delegate .ctor using that ptr 
3

Si estás buscando cómo el código Reflection.Emit debe ser, entonces algo como esto:

il.Emit(OpCodes.Ldftn, yourMethodInfo); 
il.Emit(OpCodes.Newobj, yourDelegateType.GetConstructors()[0]); 

La primera línea de carga el puntero de función en la pila. La segunda línea "lo pasa" al constructor del delegado. yourDelegateType debe ser algo así como typeof(Func<string>), etc.

+0

Sí, es una forma de crear un delegado en Reflection.Emit. Pero solo quiero el puntero de función, es decir, el resultado de ldftn – Kii

+1

@Kii, ¿qué quieres hacer con él? ¿Puede proporcionar algún (pseudo) código que ilustre lo que le gustaría lograr? –

+0

una vez un tiempo, hay un método: create_object objeto (Object [] args) entonces quiero crear un delegado a través del método: objeto _delegate = create_object (nuevo objeto [] {null, get_ptr (method_info)}); – Kii

Cuestiones relacionadas