2010-10-12 14 views
5

w kodzie cil, ldftn jest używany do uzyskania adresu wskaźnika funkcji do wywołania konstruktora delegata (to jest .ctor (object, native int)).
Jak uzyskać wskaźnik funkcji używany do tworzenia delegatów w języku C#?pobierz wskaźnik funkcji 'ldftn' w C#

+0

Czy chcesz podać adres wskaźnika surowego, czy też chcesz po prostu obiekt delegowany w zmiennej? – siride

+0

wskaźnik funkcji używany do wywoływania funkcji .ctor (tj. .ktor (object, [native int])) – Kii

+1

Nie jest jasne, o czym mówisz. Wartość _methodPtr może być generowana tylko przez kompilator JIT. Nie ma nic do połączenia, dopóki nie wygeneruje kod maszynowy dla tej metody. –

Odpowiedz

5

Twoje pytanie jest sformułowane w sposób, który utrudnia zrozumienie, co faktycznie chcesz zrobić. Myślę, że być może to, czego chcesz, to coś takiego:

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

Jeśli szukasz jak powinien wyglądać kod Reflection.Emit, wtedy coś takiego:

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

Pierwsza linia ładuje wskaźnik funkcji na stos. Druga linia "przekazuje" ją do konstruktora delegata. yourDelegateType powinno być czymś w rodzaju typeof(Func<string>), itp.

+0

Tak, to sposób na utworzenie delegata w Reflection.Emit. Ale chcę tylko wskaźnik funkcji, tj. Wyjście z Ldftn – Kii

+1

@Kii, co chcesz z nim zrobić? Czy możesz podać (pseudo) kod, który ilustruje, co chcesz osiągnąć? –

+0

na jeden raz, jest metoda: Przedmiotem create_object (Object [] arg) Potem aby utworzyć pełnomocnika za pomocą metody: Przedmiotem _delegate = create_object (nowy obiekt [] {null get_ptr (method_info)}); – Kii