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#
Odpowiedz
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
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.
Tak, to sposób na utworzenie delegata w Reflection.Emit. Ale chcę tylko wskaźnik funkcji, tj. Wyjście z Ldftn – Kii
@Kii, co chcesz z nim zrobić? Czy możesz podać (pseudo) kod, który ilustruje, co chcesz osiągnąć? –
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
Czy chcesz podać adres wskaźnika surowego, czy też chcesz po prostu obiekt delegowany w zmiennej? – siride
wskaźnik funkcji używany do wywoływania funkcji .ctor (tj. .ktor (object, [native int])) – Kii
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. –