Oop CIL指令意外返回值
我试图手动创建il指令以供学习,但遇到了一个小问题 我有一个简单的结构和一个接口:“MyInterface”和一个方法:“Handle”,一个名为“AddTwo”的类实现了“MyInterface”,还有一个“Program”类和一个entrymethod。il转储如下所示:Oop CIL指令意外返回值,oop,stack,clr,cil,reflection.emit,Oop,Stack,Clr,Cil,Reflection.emit,我试图手动创建il指令以供学习,但遇到了一个小问题 我有一个简单的结构和一个接口:“MyInterface”和一个方法:“Handle”,一个名为“AddTwo”的类实现了“MyInterface”,还有一个“Program”类和一个entrymethod。il转储如下所示: .class interface public abstract auto ansi MyInterface<TInput,TOutput> { .method public hidebysig newsl
.class interface public abstract auto ansi MyInterface<TInput,TOutput>
{
.method public hidebysig newslot abstract virtual
instance !TOutput Handle(!TInput A_1) cil managed
{
} // end of method MyInterface::Handle
} // end of class MyInterface
.class public auto ansi plusTwo
extends [mscorlib]System.Object
implements class MyInterface<int32,int32>
{
.method public hidebysig newslot virtual final
instance int32 Handle(int32 x) cil managed
{
// Code size 13 (0xd)
.maxstack 2
IL_0000: ldarg 0
IL_0004: nop
IL_0005: nop
IL_0006: ldc.i4 0x2
IL_000b: add
IL_000c: ret
} // end of method plusTwo::Handle
} // end of class plusTwo
.class public auto ansi Program
extends [mscorlib]System.Object
{
.method public static int32 Main() cil managed
{
.entrypoint
// Code size 34 (0x22)
.maxstack 2
.locals init (int32 V_0)
IL_0000: newobj instance void plusTwo::.ctor()
IL_0005: ldc.i4 0xa
IL_000a: callvirt instance !1 class MyInterface<int32,int32>::Handle(!0)
IL_000f: stloc V_0
IL_0013: nop
IL_0014: nop
IL_0015: ldloc V_0
IL_0019: nop
IL_001a: nop
IL_001b: ldc.i4 0x5
IL_0020: add
IL_0021: ret
} // end of method Program::Main
} // end of class Program
类接口公共抽象自动ansi MyInterface
{
.method公共隐藏新闻组摘要虚拟
实例!TOutput句柄(!TInput A_1)cil托管
{
}//方法MyInterface::Handle的结尾
}//类MyInterface的结尾
.class公共自动ansi plusTwo
扩展[mscorlib]System.Object
实现类MyInterface
{
.method公共隐藏新闻组虚拟最终版
实例int32句柄(int32 x)cil托管
{
//代码大小13(0xd)
.maxstack 2
IL_0000:ldarg 0
IL_0004:没有
IL_0005:没有
IL_0006:ldc.i4 0x2
IL_000b:添加
IL_000c:ret
}//方法plusTwo::Handle的结尾
}//类结束plusTwo
.class公共自动ansi程序
扩展[mscorlib]System.Object
{
.method public static int32 Main()cil managed
{
.入口点
//代码大小34(0x22)
.maxstack 2
.locals init(int32 V_0)
IL_0000:newobj实例void plusTwo::.ctor()
IL_0005:ldc.i4 0xa
IL_000a:callvirt实例!1类MyInterface::Handle(!0)
IL_000f:stloc V_0
IL_0013:没有
IL_0014:没有
IL_0015:ldloc V_0
IL_0019:没有
IL_001a:没有
IL_001b:ldc.i4 0x5
IL_0020:添加
IL_0021:ret
}//方法程序结束::Main
}//课程结束
在上面的例子中,我期望输出为:17,但是我得到的是一个随机的高整数,它随着每次测试而变化。看起来像是内存地址之类的。有人能通过查看上面生成的IL来判断问题是什么吗?任何帮助都将不胜感激。ldarg 0为实例方法生成this指针。将其设置为静态方法或使用ldarg 1。否则,通过先用C#编写代码并查看编译器生成的IL,您总能发现一些东西。@HansPassant:这就成功了,非常感谢。你应该把这个贴出来作为答案。