读书人

il指令中call一个构造函数和newobj一

发布时间: 2012-01-30 21:15:58 作者: rapoo

il指令中,call一个构造函数和newobj一个对象的结果为啥不一样?(了解IL的情帮助)
.assembly extern mscorlib { auto }
.assembly extern System { auto }
.assembly MyApp {}

.class MyClass
{
.field int32 X

.method public specialname void .ctor()
{
ldarg.0
call instance void [mscorlib]System.Object::.ctor()

ldarg.0
ldc.i4 10
stfld int32 MyClass::X

ret
}
}

.method static void Test()
{
.locals init (class MyClass mc)

//***********************************
ldloca mc
call instance void MyClass::.ctor()

ldloc mc
ldfld int32 MyClass::X ///---这句会报错“Object reference not set to an instance of an object.“
//***********************************
pop
ret
}

如果我把上面框住的换成这样
//***********************************
ldloca mc
call instance void MyClass::.ctor()

ldloca mc //这里换成了ldloca
ldfld int32 MyClass::X
//***********************************
就可以通过了,为什么呢?

另外如果我换成
//***********************************
newobj instance void MyClass::.ctor()
stloc mc

ldloc mc
//ldloca mc
ldfld int32 MyClass::X
//***********************************
那么无论是ldloc mc 还是ldloca mc 都可以通过,为什么呢?




[解决办法]
两个ldloca居然能通过,不解。。。

MSIL code
     //***********************************     ldloc mc      //这里换成了ldloc     call instance void MyClass::.ctor()     ldloc mc      //这里不变     ldfld int32 MyClass::X     //*********************************** 

读书人网 >.NET Framework

热点推荐