C#ILGenerator Nop? [英] c# ILGenerator nop?
本文介绍了C#ILGenerator Nop?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我用ILGenerator生成一些IL,这是我的代码:
Im generating some IL with the ILGenerator here is my code:
DynamicMethod method = new DynamicMethod("test", null, Type.EmptyTypes);
ILGenerator gen = method.GetILGenerator();
gen.Emit(OpCodes.Ldarg_0);
gen.Emit(OpCodes.Ldarg_1);
gen.Emit(OpCodes.Ldc_I4_S, 100);
这会生成此IL:
IL_0000: ldarg.0
IL_0001: ldarg.1
IL_0002: ldc.i4.s 100
IL_0004: nop
IL_0005: nop
IL_0006: nop
(我从名为ILStream的VS Virtulizer获得了IL代码)
(I get the IL Code from a VS Virtulizer named ILStream)
nops从哪里编码?有什么办法摆脱它们?
我试图模仿一些C#代码,但没有3点。
From where do the nops code? is there any way to get rid of them? Im trying to imitate some c# code and it doesn't have 3 nops.
推荐答案
我通过以下方法解决了该问题:将int强制转换为值:
I solved the problem by casting the int to a value:
代码:
private static bool IsBetween(int value, int min, int max)
{
return (value >= min && value <= max);
}
private static void WriteInt(ILGenerator gen, int value)
{
gen.Emit(OpCodes.Ldarg_1);
if (IsBetween(value, sbyte.MinValue, sbyte.MaxValue))
{
gen.Emit(OpCodes.Ldc_I4_S, (sbyte)value);
}
else if (IsBetween(value, byte.MinValue, byte.MaxValue))
{
gen.Emit(OpCodes.Ldc_I4_S, (byte)value);
}
else if (IsBetween(value, short.MinValue, short.MaxValue))
{
gen.Emit(OpCodes.Ldc_I4_S, (short)value);
}
else
{
gen.Emit(OpCodes.Ldc_I4_S, value);
}
}
这篇关于C#ILGenerator Nop?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文