- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用 ILGenerator.Emit 生成动态类型。我正在生成一个方法主体,它将方法参数的类型存储在一个数组中。为了实际将元素存储在数组中,我循环遍历给定方法的参数并构建必要的 IL 来存储元素。在第二次迭代中,Break 指令出现在 Stelem.ref (下面的 L_003d) 指令之后。这总是在第二次迭代时发生,我不知道为什么。这是代码:
ilGenerator.Emit(OpCodes.Ldc_I4, exampleMethod.GetParameters().Length);
ilGenerator.Emit(OpCodes.Newarr, typeof(Type));
ilGenerator.Emit(OpCodes.Stloc, typeArray);
for (int idx = 0; idx < exampleMethod.GetParameters().Length; idx++)
{
ilGenerator.Emit(OpCodes.Ldloc, typeArray);
ilGenerator.Emit(OpCodes.Ldc_I4, idx);
ilGenerator.Emit(OpCodes.Ldarg, idx + 1);
ilGenerator.Emit(OpCodes.Box, typeof(int));
ilGenerator.EmitCall(OpCodes.Callvirt, typeof(object).GetMethod("GetType"), null);
ilGenerator.Emit(OpCodes.Stelem_Ref, idx);//second iteration causes a break to be output in the IL
}
ilGenerator.Emit(OpCodes.Ret);
IL 输出在这里
.method public virtual instance int32 Add3(int32, int32, int32) cil managed
{
.maxstack 3
.locals init (
[0] class [mscorlib]System.Type[] typeArray)
L_0000: ldc.i4 3
L_0005: newarr [mscorlib]System.Type
L_000a: stloc.0
L_000b: ldloc.0
L_000c: ldc.i4 0
L_0011: ldarg A_0
L_0015: nop
L_0016: nop
L_0017: box int32
L_001c: callvirt instance class [mscorlib]System.Type [mscorlib]System.Object::GetType()
L_0021: stelem.ref
L_0022: nop
L_0023: nop
L_0024: nop
L_0025: nop
L_0026: ldloc.0
L_0027: ldc.i4 1
L_002c: ldarg A_1
L_0030: nop
L_0031: nop
L_0032: box int32
L_0037: callvirt instance class [mscorlib]System.Type [mscorlib]System.Object::GetType()
L_003c: stelem.ref
**L_003d: break**
L_003e: nop
L_003f: nop
L_0040: nop
L_0041: ldloc.0
L_0042: ldc.i4 2
L_0047: ldarg A_2
L_004b: nop
L_004c: nop
L_004d: box int32
L_0052: callvirt instance class [mscorlib]System.Type [mscorlib]System.Object::GetType()
L_0057: stelem.ref
L_0058: ldarg.0
L_0059: nop
L_005a: nop
L_005b: nop
L_005c: ret
}
如有任何指点或建议,我们将不胜感激。
非常感谢
德莫特
最佳答案
break 的操作码是 0x01,顺便说一句,它也是您作为参数传递给 stelem.ref emit 的 idx 值。请注意,在第三次迭代中有一个额外的 ldarg.0(其中 idx 为 2)。
您不应该为 stelem emit 指定参数。
关于cil - ILGenerator 在数组中存储元素时发出 Break 指令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4085157/
给出以下代码: using System; using System.Reflection.Emit; using System.Diagnostics; using System.Reflectio
我正在尝试构造一个泛型类型的实例并在该实例上调用一个方法。然后返回方法的结果。 var genericType = typeof(GenericType<>).MakeGenericType(type
我想得到这个: .property instance class [WorldTool.Core]WorldTool.IInputPort SomePort { .get instance c
我正在尝试使用 DynamicMethod 并尝试使用 IL 来创建一些对象。我想创建以下非常基本的对象: new Queue(new List{100}); 我已经使用 ILDASM 查看生成此代码
我正在使用 System.Reflection.Emit 为类型生成包装器。在某一时刻,原始对象可能会在访问时抛出错误 (FaultException),并且该错误应该被我的 try { } catc
Food obj = ...; ILGenerator gen = (...).GetILGenerator(); gen.Emit( ?? obj ?? ); // replace this gen
我使用 ILGenerator 生成一些 IL,这是我的代码: DynamicMethod method = new DynamicMethod("test", null, Type.EmptyTyp
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
我必须将一个对象的实例传递给一个函数,所以显然所有要作为参数的信息都将加载到评估堆栈中这是我正在寻找的代码 someClass SomeObject = new someClass(); il.Emi
使用 Ildasm 我得到了这个: .method public hidebysig virtual instance string Mymethod() cil manage
我已经编写了一些函数来使用 ILGenerator 创建一个 exe 文件。我想要的是向用户展示在不使用外部工具(如 ILDasm 或 Reflector)的情况下生成的 IL 语言。 在我的程序执行
考虑为我自己的语言制作编译器,我尝试使用 Reflection.Emit 框架生成一些 MSIL 代码。当我声明局部变量时使用 int 时它工作正常。但是,当我想声明一个尚未编译的类型的局部变量时,我
我正在使用 ILGenerator.Emit 生成动态类型。我正在生成一个方法主体,它将方法参数的类型存储在一个数组中。为了实际将元素存储在数组中,我循环遍历给定方法的参数并构建必要的 IL 来存储元
如何使用 ILGenerator 设置 .maxstack 指令? 例如,典型的 setter 方法的 .maxstack 为 2: .maxstack 2 // The evalua
我如何使用 ILGenerator.Emit(不是 LambdaExpression.Compile?因为我正在尝试寻找性能更高的解决方案)动态创建具有未知 MethodInfo 的委托(delega
我有一些代码使用 IlGenerator.Emit 使用数据读取器创建和填充通用对象。它工作得很好,但是我需要扩展它以在数据库字段名称包含下划线时填充简单的子对象。 例如,名为“Address_Lin
基本上,我试图将字节数组中的数据反序列化为对象。我正在尝试使用 UTF8 编码的 GetString 方法来读取字符串。这是我的部分代码: var mm = new DynamicMethod("ge
我正在使用 System.Reflection.Emit,有时我想从 MethodBuilder 创建一个委托(delegate): MethodBuilder fooBuilder = create
我正在尝试通过在运行时发出 IL 来编译 DynamicMethod。我希望它执行以下操作: array.OrderByDesc( /* Select Field/Property Expressio
我添加到 ILGenerator 字符串 ilGen.Emit(OpCodes.Ldarg_0); ilGen.Emit(OpCodes.Ldfld, readField); 和 ilGen.Emit
我是一名优秀的程序员,十分优秀!