2012-06-21 12 views
5

Ich versuche, wenn ILS in IL von System.Reflection und System.Reflection.Emit funktionieren. Dies ist der Code, den ich derzeit haben:C# wenn sonst Ausnahme

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(); 

nun auf der Linie, wo ich Etikett Kennzeichnung bin es mir diese Ausnahme auslöst:

Objektverweis nicht auf eine Instanz eines Objekts festgelegt.

My exception.

Aber ich denke, es ist die Dummheit ist, weil das Label mit neuem Label-Objekt zugeordnet ist. Weiß jemand, wie ich dieses Problem lösen kann? Vielen Dank.

Antwort

7

Müssen Sie Ihre Etiketten nicht als Label whatever = g.DefineLabel(); definieren, nachdem Sie g definiert haben?

+0

oh ja, das stimmt. Vielen Dank. – user35443