c# - Get value of static field via dynamic method -
मुझे निम्नलिखित वर्ग मिल गया है:
सार्वजनिक वर्ग TestClass {सार्वजनिक स्थिर पढ़ने के लिए स्ट्रिंग हैलो = "हैलो,"; सार्वजनिक स्थिर स्ट्रिंग SayHello (स्ट्रिंग का नाम) {वापसी हैलो + नाम; }}
और मैं DynamicMethod के माध्यम से हैलो के स्थैतिक क्षेत्र का उपयोग करना चाहता हूं। GetValue के साथ मानक प्रतिबिंब कार्य करता है:
सार्वजनिक स्थिर स्ट्रिंग GetViaInvoke () {प्रकार टीसीटीप = टाइपफ (TestClass); FieldInfo fi = tcType.GetField ("हैलो"); स्ट्रिंग परिणाम = fi.GetValue (रिक्त) स्ट्रिंग के रूप में; वापसी परिणाम; }
लेकिन मुझे कुछ इसी तरह की आवश्यकता है (OpCodes समान विधि के ILDasm से आते हैं):
सार्वजनिक स्थिर स्ट्रिंग GetViaDynamicMethod () {प्रकार टीसीटीप = टाइपफ ( TestClass); FieldInfo fi = tcType.GetField ("हैलो"); डायनेमिकमिथ डीएम = नया डायनेमिकमथ ("गेटहोल्लो", टाइपफ (स्ट्रिंग), टाइप। एक्ट टाईप); ILGenerator आईएल = डीएम। GETILGenerator (); iL.DeclareLocal (typeof (स्ट्रिंग)); iL.Emit (OpCodes.Nop); आईएल। एमिट (ओप.सीोड्स। एलडीएसफ़ल्ड, फाई); iL.Emit (OpCodes.Stloc_0); आईएल। एमिट (ओपीसीोड्स। BR_S, 0x0 9); iL.Emit (OpCodes.Ldloc_0); iL.Emit (OpCodes.Ret); समारोह के & lt; स्ट्रिंग & gt; Fun = dm.CreateDelegate (फ़नक & lt; स्ट्रिंग & gt;) के रूप में (टाइपफ (फ़नक & lt; स्ट्रिंग & gt;)); स्ट्रिंग परिणाम = मजेदार (); वापसी परिणाम; }
यह विचार preety सरल है, गतिशील तरीके गैर-स्थिर क्षेत्रों (एलडीएफल्ड opcode और यह ऑब्जेक्ट) के साथ ठीक काम करते हैं, लेकिन जब मैं acces की कोशिश करता हूं स्थिर फ़ील्ड मुझे अपवाद प्राप्त होता है:
System.InvalidProgramException अप्रतिबंधित था संदेश = अमान्यप्रोग्राम एक्सपॉशन
आईएसएल कोड को आज़माकर आप को डिकंपिल्ड कोड पर लिखते हैं जो वही एक अच्छा विचार है, लेकिन फिर भी आपको यह समझने की आवश्यकता है कि आप क्या कर रहे हैं।
अगर आप देखेंगे, तो आप 'देखेंगे कि आप इसे लेबल
, नहीं int
के साथ प्रयोग करना चाहते हैं। मुझे लगता है कि आपके कोड शाखाओं में BR_S
बाइट ऑफ़सेट 9 पर एक निर्देश के लिए है, लेकिन मुझे नहीं पता है कि कौन सा निर्देश है और आपको इस तरह से कोड नहीं लिखना चाहिए।
यदि आप स्थिर क्षेत्र के मूल्य को लोड करना चाहते हैं और उसे वापस लौटा चाहते हैं, तो आपको किसी भी स्थानीय चर या शाखाओं की ज़रूरत नहीं है। निम्नलिखित पर्याप्त है:
iL.Emit (OpCodes.Ldsfld, fi); iL.Emit (OpCodes.Ret);
यह क्या करता है कि यह मूल्यांकन स्टैक पर मूल्य को लोड करता है और फिर तुरंत रिटर्न देता है। यह काम करता है, क्योंकि जब आप किसी विधि से वापस आते हैं, तो मान वापस लौटाता है, मूल्यांकन मान पर जो एकल मान होता है वह वापस मूल्य के रूप में उपयोग किया जाता है।
Comments
Post a Comment