2009-08-18 28 views
5

Làm cách nào để xác định DynamicMethod cho đại biểu có tham số out, như thế này?DynamicMethod và out-parameters?

public delegate void TestDelegate(out Action a); 

Hãy nói rằng tôi chỉ đơn giản là muốn có một phương pháp mà bộ lập luận a để null khi tôi gọi phương thức. Lưu ý rằng tôi biết rằng có lẽ cách tốt hơn để xử lý việc này là làm cho phương thức trả về đại biểu Action, nhưng đây chỉ là một phần đơn giản của một dự án lớn hơn và phương thức được đề cập đã trả về một giá trị, tôi cần phải xử lý tham số out ngoài nó, do đó là câu hỏi.

Tôi cố gắng này:

using System; 
using System.Text; 
using System.Reflection.Emit; 

namespace ConsoleApplication8 
{ 
    public class Program 
    { 
     public delegate void TestDelegate(out Action a); 

     static void Main(String[] args) 
     { 
      var method = new DynamicMethod("TestMethod", typeof(void), 
       new Type[] { typeof(Action).MakeByRefType() }); 
      var il = method.GetILGenerator(); 

      // a = null; 
      il.Emit(OpCodes.Ldnull); 
      il.Emit(OpCodes.Starg, 0); 

      // return 
      il.Emit(OpCodes.Ret); 

      var del = (TestDelegate)method.CreateDelegate(typeof(TestDelegate)); 
      Action a; 
      del(out a); 
     } 
    } 
} 

Tuy nhiên, tôi có được điều này:

VerificationException was unhandled: 
Operation could destabilize the runtime. 

trên dòng del(out a);.

Lưu ý rằng nếu tôi nhận xét hai dòng tải một giá trị rỗng trên ngăn xếp và cố gắng lưu trữ nó vào đối số, phương thức sẽ chạy mà không có ngoại lệ.


Sửa: Đây có phải là phương pháp tốt nhất?

il.Emit(OpCodes.Ldarg_0); 
il.Emit(OpCodes.Ldnull); 
il.Emit(OpCodes.Stind_Ref); 
+0

Có thực sự cần thiết để tạo phương pháp động không? tại sao không chỉ thực hiện phương thức trong một lớp mà có thể được cấu hình để làm những gì bạn muốn trong thời gian chạy? –

+0

Nó thực sự phải là một phương pháp năng động, đây là một nỗ lực tối ưu hóa cuối cùng để có được một cây gọi dựa trên sự phản chiếu rất lớn để thực thi nhanh hơn. Cho đến nay, chi phí của việc sử dụng phương pháp tiếp cận phương pháp động ngược lại mã hiện tại có vẻ ít hơn khoảng 85%, và đây là mã sẽ được gọi là hàng nghìn lần mỗi giây. Các phép đo cho thấy rằng khá nhiều CPU được gắn lên trong mã phản chiếu hiện có. –

Trả lời

6

Một out tranh luận chỉ là một cuộc tranh luận ref với OutAttribute áp dụng cho các tham số.

Để lưu vào đối số theo tham chiếu, bạn cần sử dụng mã vạch stind, vì đối số chính nó là con trỏ được quản lý đến vị trí thực tế của đối tượng.

ldarg.0 
ldnull 
stind.ref 
Các vấn đề liên quan