2010-10-12 55 views
5

trong mã cil, ldftn được sử dụng để lấy địa chỉ con trỏ hàm để gọi hàm tạo của đại biểu (ví dụ .ctor (object, native int)).
Cách lấy con trỏ hàm được sử dụng để xây dựng đại biểu trong C#?lấy con trỏ hàm 'ldftn' trong C#

+0

Bạn có muốn địa chỉ con trỏ thô, hoặc bạn chỉ muốn một đối tượng đại biểu trong một biến? – siride

+0

con trỏ hàm được sử dụng để gọi hàm .ctor (ví dụ: .ctor (đối tượng, [native int])) – Kii

+1

Nó không rõ ràng những gì bạn đang nói về ctor. Giá trị _methodPtr chỉ có thể được tạo bởi trình biên dịch JIT. Không có gì để gọi cho đến khi nó tạo mã máy cho phương thức. –

Trả lời

5

Câu hỏi của bạn được hiểu theo cách khó hiểu những gì bạn đang thực sự cố gắng thực hiện. Tôi nghĩ rằng có lẽ những gì bạn muốn là một cái gì đó như thế này:

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

Nếu bạn đang tìm kiếm các mã Reflection.Emit nên xem xét như thế nào, sau đó một cái gì đó như thế này:

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

Dòng đầu tiên tải con trỏ hàm vào stack. Dòng thứ hai "chuyển" nó tới hàm tạo của delegate. yourDelegateType phải giống như typeof(Func<string>), v.v.

+0

Vâng, đó là một cách để tạo đại biểu trong Reflection.Emit. Nhưng tôi chỉ muốn con trỏ hàm tức là đầu ra của ldftn – Kii

+1

@Kii, bạn muốn làm gì với nó? Bạn có thể cung cấp một số mã giả để minh họa những gì bạn muốn thực hiện không? –

+0

Ngày xửa ngày xưa, có một phương pháp: đối tượng create_object (object [] args) sau đó tôi muốn tạo ra một đại biểu thông qua phương pháp: đối tượng _delegate = create_object (object mới [] {null, get_ptr (method_info)}); – Kii

Các vấn đề liên quan