2012-06-21 23 views
5

Tôi đang cố gắng làm cho người khác làm việc trong IL bằng System.Reflection và System.Reflection.Emit. Đây là mã mà tôi hiện có:C# nếu có ngoại lệ khác

Label inequality = new System.Reflection.Emit.Label(); 
Label equality = new System.Reflection.Emit.Label(); 
Label end = new System.Reflection.Emit.Label(); 
var method = new DynamicMethod("dummy", null, Type.EmptyTypes); 
var g = method.GetILGenerator(); 
g.Emit(OpCodes.Ldstr, "string"); 
g.Emit(OpCodes.Ldstr, "string"); 
g.Emit(OpCodes.Call, typeof(String).GetMethod("op_Equality", new Type[]{typeof(string), typeof(string)})); 
g.Emit(OpCodes.Ldc_I4, 0); 
g.Emit(OpCodes.Ceq); 
g.Emit(OpCodes.Brtrue_S, inequality); 
g.MarkLabel(inequality); //HERE it throws exception 
g.Emit(OpCodes.Ldstr, "Specified strings are different."); 
g.Emit(OpCodes.Call, typeof(Console).GetMethod("WriteLine", new Type[]{typeof(string)})); 
g.Emit(OpCodes.Br_S, end); 
g.Emit(OpCodes.Brfalse_S, equality); 
g.MarkLabel(equality); 
g.Emit(OpCodes.Ldstr, "Specified strings are same."); 
g.Emit(OpCodes.Call, typeof(Console).GetMethod("WriteLine", new Type[] { typeof(string) })); 
g.Emit(OpCodes.Br_S, end); 
g.MarkLabel(end); 
g.Emit(OpCodes.Ret); 

var action = (Action)method.CreateDelegate(typeof(Action)); 
action(); 

Console.Read(); 

Bây giờ, trên đường nơi tôi đánh dấu nhãn nó ném tôi ngoại lệ này:

Object tài liệu tham khảo không được đặt để một thể hiện của một đối tượng.

My exception.

Nhưng tôi nghĩ rằng đó là sự ngu dốt vì nhãn được liên kết với đối tượng Label mới. Có ai biết làm thế nào tôi có thể giải quyết vấn đề này? Cảm ơn.

Trả lời

7

Bạn không cần phải xác định nhãn của mình là Label whatever = g.DefineLabel(); sau khi bạn đã xác định g?

+0

oh vâng, điều đó đúng. Cảm ơn bạn. – user35443

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