2012-06-21 18 views
5

मैं सिस्टम द्वारा आईएल में काम करने की कोशिश कर रहा हूं- रिफ्लेक्शन और सिस्टम। रिफ्लेक्शन.इमिट।सी # यदि अन्य अपवाद

वस्तु एक वस्तु का एक उदाहरण के लिए सेट नहीं संदर्भ:

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

अब, लाइन, जहां मैं लेबल अंकन कर रहा हूँ पर यह मेरे इस अपवाद फेंकता है: यह कोड है जो मैं वर्तमान में है।

My exception.

लेकिन मुझे लगता है क्योंकि उस लेबल नया लेबल वस्तु के साथ जुड़ा हुआ है यह मूर्खता है। क्या कोई जानता है कि मैं इस समस्या को कैसे हल कर सकता हूं? धन्यवाद।

उत्तर

7

g परिभाषित करने के बाद आपको अपने लेबल को Label whatever = g.DefineLabel(); के रूप में परिभाषित करने की आवश्यकता नहीं है?

+0

ओह हाँ, यह सच है। धन्यवाद। – user35443