लोड करने के लिए एमिट आईएल कोड मेरे पास आईएल कोड उत्सर्जित करने के लिए इस तरह का कोड है जो पूर्णांक या स्ट्रिंग मान लोड करता है। लेकिन मुझे नहीं पता कि decimal
उस प्रकार को कैसे जोड़ना है। यह Emit
विधि में समर्थित नहीं है। इसके लिए कोई समाधान?दशमलव मान
ILGenerator ilGen = methodBuilder.GetILGenerator();
if (type == typeof(int))
{
ilGen.Emit(OpCodes.Ldc_I4, Convert.ToInt32(value, CultureInfo.InvariantCulture));
}
else if (type == typeof(double))
{
ilGen.Emit(OpCodes.Ldc_R8, Convert.ToDouble(value, CultureInfo.InvariantCulture));
}
else if (type == typeof(string))
{
ilGen.Emit(OpCodes.Ldstr, Convert.ToString(value, CultureInfo.InvariantCulture));
}
काम नहीं:
else if (type == typeof(decimal))
{
ilGen.Emit(OpCodes.Ld_???, Convert.ToDecimal(value, CultureInfo.InvariantCulture));
}
संपादित करें: ठीक है, तो यहाँ मैं क्या किया है:,
else if (type == typeof(decimal))
{
decimal d = Convert.ToDecimal(value, CultureInfo.InvariantCulture);
// Source: https://msdn.microsoft.com/en-us/library/bb1c1a6x.aspx
var bits = decimal.GetBits(d);
bool sign = (bits[3] & 0x80000000) != 0;
byte scale = (byte)((bits[3] >> 16) & 0x7f);
ilGen.Emit(OpCodes.Ldc_I4, bits[0]);
ilGen.Emit(OpCodes.Ldc_I4, bits[1]);
ilGen.Emit(OpCodes.Ldc_I4, bits[2]);
ilGen.Emit(sign ? OpCodes.Ldc_I4_1 : OpCodes.Ldc_I4_0);
ilGen.Emit(OpCodes.Ldc_I4, scale);
var ctor = typeof(decimal).GetConstructor(new[] { typeof(int), typeof(int), typeof(int), typeof(bool), typeof(byte) });
ilGen.Emit(OpCodes.Newobj, ctor);
}
लेकिन यह एक newobj
opcode उत्पन्न नहीं करता है, लेकिन इसके बजाय nop
और stloc.0
। कन्स्ट्रक्टर Emit
कॉल पर पाया और पास हो गया। यहाँ क्या गलत है? स्पष्ट रूप से उत्पन्न InvalidProgramException
जेनरेट कोड को निष्पादित करने का प्रयास करते समय फेंक दिया गया है क्योंकि स्टैक पूरी तरह से गड़बड़ हो गया है।
"लोड दशमलव" के लिए स्पष्ट रूप से (लेकिन इसके लिए मेरा शब्द न लें) प्रत्यक्ष ओपोड नहीं है, आप तर्क लोड करते हैं और दशमलव कन्स्ट्रक्टर को कॉल करते हैं: http देखें : //stackoverflow.com/a/485834/266143 – CodeCaster
भी देखें http://codeblog.jonskeet.uk/2014/08/22/when-is-a-constant-not-a-constant-when-its-a -decimal /। संक्षेप में: decimals सीएलआर आदिम प्रकार नहीं हैं और सीधे एक लोड करने के लिए कोई आईएल opcode नहीं है। –
एक गैर-कार्य समाधान के लिए उपरोक्त मेरा संपादन देखें। – ygoe